博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素...
阅读量:5906 次
发布时间:2019-06-19

本文共 9937 字,大约阅读时间需要 33 分钟。

 

服务端配置

如果不想自己写,可以通过 Net Manager 来配置.

以下配置文件中的 localhost 改为 ip 地址,否则,远程不能访问.

1.网络监听配置

# listener.ora Network Configuration File: C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora# Generated by Oracle configuration tools.SID_LIST_LISTENER =  (SID_LIST =    (SID_DESC =      (SID_NAME = CLRExtProc)      (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)      (PROGRAM = extproc)      (ENVS = "EXTPROC_DLLS=ONLY:C:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")    )  )LISTENER =  (DESCRIPTION_LIST =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))    )  )ADR_BASE_LISTENER = C:\app\Administrator

多个IP时,如下:

LISTENER =  (DESCRIPTION_LIST =    (DESCRIPTION =      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.226.2)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.226.3)(PORT = 1521)) ) )

2.TNS 配置

# tnsnames.ora Network Configuration File: C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\tnsnames.ora# Generated by Oracle configuration tools.ORCL=  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))    (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = orcl)    )  )ORACLR_CONNECTION_DATA =  (DESCRIPTION =    (ADDRESS_LIST =      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))    )    (CONNECT_DATA =      (SID = CLRExtProc)      (PRESENTATION = RO)    )  )LISTENER_ORCL =  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

多个IP时,如下:

ORCL =  (DESCRIPTION =    (ADDRESS_LIST =      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.226.2)(PORT = 1521)) (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.226.3)(PORT = 1521)) ) (SOURCE_ROUTE = yes) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) )

3.停止和启动服务

先停止以下服务,然后再启动.

  • OracleOraDb11g_homeTNSListener
  • OracleService*

客户端配置

1.下载 ODAC 压缩包.

2.解压下载的 ODAC 压缩包.

3.执行安装命令

示例:

install.bat all D:\Program\ODAC\12040x64 OracleHome true

4.添加环境变量

  • ORACLE_HOME : 是 ODAC 安装的目录.
  • TNS_ADMIN : 是文件 tnsnames.ora 所在的目录,一般为 ODAC 安装目录下的 network\admin 中.

注: TNS_ADMIN 可以不用添加,直接将 tnsnames.ora 文件复制到 ODAC 安装目录下即可

将 %ORACLE_HOME% 添加到 PATH 环境变量中.

5.配置 TNS

在配置文件 tnsnames.ora 中加入

DBORCL =  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = 
)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME =
) ) )

说明:

  • <db-host> : 数据库电脑的IP或者是计算机名
  • <db-name> : 数据库TNS配置的名称
本作品由 SeayXu创作,采用进行许可。
基于上的作品创作。
可自由转载、引用,但需署名作者且注明文章出处,并以相同方式共享。
 
 
 

 

前言

FontAwesome 大家都不陌生,精美的图标,出现在各式各样的网页中。

最近在做 Windows Forms 应用程序,要求美观,就想能不能把 FontAwesome 图标用上,于是就有了本文。

本人已经将 FontAwesome 进行了封装,并上传到了 GitHub 和 NuGet。

  • GitHub:
  • 码云:
  • NuGet:

样图

sample application

简介

下面是解决方案列表:

solution

|- .nuget|- sample   |--- FontAwesomeNet.Sample        # Windows Forms Samlpe   |--- FontAwesomeNet.Wpf.Sample    # WPF Samlpe|- src   |--- FontAwesomeNet   # FontAwesome for .NET library

使用

可以参考示例源码。

0. 安装字体

安装过请忽略,地址是:。

1. 安装类库

PM> Install-Package FontAwesomeNet

2. 添加命名空间

using FontAwesomeNet;

3. 生成图片(Image)或图标(Icon)

使用的是 FontAwesome 静态类。

获取字体图标名称:

// get FontAwesome icon class names(type is Dictionary
)string[] names = FontAwesome.TypeDict.Select(v => v.Key).ToArray();

获取字体图标名称对应的Unicode码:

// use FontAwesome icon class name get FontAwesome icon Unicode valueint val = FontAwesome.TypeDict["fa-heart"];//0xf004

获取图片和图标:

只有这两个方法。

Bitmap bmp = FontAwesome.GetImage(val);//0xf004Icon ico = FontAwesome.GetIcon(val);//0xf004

修改默认参数:

直接对静态字段赋值即可。

FontAwesome.IconSize = 128;//change icon sizeFontAwesome.ForeColer = Color.Purple;//change icon forecolor ...

如有不好的地方,欢迎大家更正,谢谢。

本作品由 SeayXu创作,采用进行许可。
基于上的作品创作。
可自由转载、引用,但需署名作者且注明文章出处,并以相同方式共享。
 
 
 

 

Q:

在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常。

Xml反序列化异常

即在 XML文档(0, 0)中有一个错误:缺少根元素。

A:

首先看下代码:

StringBuilder sb = new StringBuilder();using (MemoryStream stream = new MemoryStream()){    StreamWriter writer = new StreamWriter(stream);    writer.Write(sb.ToString().Trim());    writer.Flush();    //stream.Position=0; // or //stream.Seek(0, SeekOrigin.Begin); StreamReader reader = new StreamReader(stream); XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); object obj = xmlSerializer.Deserialize(reader); reader.Close(); reader.Close(); writer.Close(); writer.Dispose(); }

抛出异常是在object obj = xmlSerializer.Deserialize(reader);这里出现的。

问题在于writer.Write(sb.ToString().Trim());这里,原因是进行了写入操作,最后流的位置停留在尾部。因此,在反序列化之前将流的位置定位到开始 0 的位置即可。

这里就是在 上面注释的地方。

本作品由 SeayXu创作,采用进行许可。
基于上的作品创作。
可自由转载、引用,但需署名作者且注明文章出处,并以相同方式共享。
 
 

 

前言

在开发应用程序时,通常只让程序运行一个实例。所以,就要判断程序是否已经运行。

下面是我自己在项目中使用到,封装好的帮助类。有 普通的 C# 应用程序 和 Windows CE 和 Windows Mobile 应用程序使用的方法。

主要是通过 System.Threading.Mutex 类 和 Win32 API 来实现,下面就是各自的代码,调用示例在最后面。

普通 C# 应用程序

主要是 Windows 窗体应用程序和控制台程序。

1. 使用 System.Threading.Mutex 类

参考:

using System.Threading;namespace XY.Util.Helper{    ///  /// Mutex helper ///  public class MutexHelper { ///  /// 判断程序是否已经运行 /// 程序集实例 ///  /// 
/// true: 程序已运行 /// false: 程序未运行 ///
public static bool IsApplicationOnRun(System.Reflection.Assembly assembly) { string strAppName = assembly.GetName().Name; return IsApplicationOnRun(strAppName); } /// /// 判断程序是否已经运行 /// 程序名称 /// ///
/// true: 程序已运行 /// false: 程序未运行 ///
public static bool IsApplicationOnRun(string assemblyName) { bool ret = false; //第一个参数:true--给调用线程赋予互斥体的初始所属权 //第一个参数:互斥体的名称 //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true Mutex mutex = new Mutex(true, assemblyName, out ret); return !ret; } } }

2. 使用 Win32 API

using System;using System.Runtime.InteropServices;namespace XY.Util.Helper{    ///  /// Mutex helper ///  public class MutexHelper { [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr OpenMutex(uint dwDesiredAccess, bool bInitialOwner, string lpName); [DllImport("Kernel32.dll", CharSet = CharSet.Auto)] public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName); ///  /// 判断程序是否已经运行 /// 程序集实例 ///  /// 
/// true: 程序已运行 /// false: 程序未运行 ///
public static bool IsApplicationOnRun(System.Reflection.Assembly assembly) { string strAppName = assembly.GetName().Name; return IsApplicationOnRun(strAppName); } /// /// 判断程序是否已经运行 /// 程序名称 /// ///
/// true: 程序已运行 /// false: 程序未运行 ///
public static bool IsApplicationOnRun(string assemblyName) { bool ret = false; if (OpenMutex(0x1F0001, false, assemblyName) == IntPtr.Zero) { CreateMutex(IntPtr.Zero, false, assemblyName); ret = true; } return ret; } } }

Windows CE | Windows Mobile 应用程序

在 Windows CE 和 Windows Mobile 中实现,是通过 Win32 API实现的,下面是封装的帮助类:

参考:

using System;using System.Runtime.InteropServices;namespace XY.Util.Helper{    ///  /// Mutex helper ///  public class MutexHelper { [DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)] public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName); [DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)] public static extern bool ReleaseMutex(IntPtr hMutex); private const int ERROR_ALREADY_EXISTS = 0183; ///  /// 判断程序是否已经运行 /// 程序集实例 ///  /// 
/// true: 程序已运行 /// false: 程序未运行 ///
public static bool IsApplicationOnRun(System.Reflection.Assembly assembly) { string strAppName = assembly.GetName().Name; return IsApplicationOnRun(strAppName); } /// /// 判断程序是否已经运行 /// 程序名称 /// ///
/// true: 程序已运行 /// false: 程序未运行 ///
public static bool IsApplicationOnRun(string assemblyName) { IntPtr hMutex = CreateMutex(IntPtr.Zero, true, assemblyName); if (hMutex == IntPtr.Zero) { throw new ApplicationException("Failure creating mutex: " + Marshal.GetLastWin32Error().ToString("X")); } if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS) { ReleaseMutex(hMutex); return true; } return false; } } }

示例代码

调用示例:

using System;using System.Reflection;using XY.Util.Helper;namespace MutexTest { static class Program { [MTAThread] static void Main(string[] args) { bool run; //方式一 run = MutexHelper.IsApplicationOnRun("ApplicationName"); //方式二 run = MutexHelper.IsApplicationOnRun(Assembly.GetExecutingAssembly()); if (run) { // application is running... // Exit. } else { // start application ... // startup... } } } }
本作品由 SeayXu创作,采用进行许可。
基于上的作品创作。
可自由转载、引用,但需署名作者且注明文章出处,并以相同方式共享。
 
 

2018-05-02 17:02 by HilaryHe, 14 阅读, 0 评论, , 

Decimal类型截取保留N位小数向上取

Decimal类型截取保留N位小数并且不进行四舍五入操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public 
class 
DecimalHelper
{
    
/// <summary>
    
/// Decimal类型截取保留N位小数并且不进行四舍五入操作
    
/// </summary>
    
/// <param name="d"></param>
    
/// <param name="n"></param>
    
/// <returns></returns>
    
public 
static 
decimal 
CutDecimalWithN(
decimal 
d, 
int 
n)
    
{
        
string 
strDecimal = d.ToString();
        
int 
index = strDecimal.IndexOf(
"."
);
        
if 
(index == -1 || strDecimal.Length < index + n + 1)
        
{
            
strDecimal = 
string
.Format(
"{0:F" 
+ n + 
"}"
, d);
        
}
        
else
        
{
            
int 
length = index;
            
if 
(n != 0)
            
{
                
length = index + n + 1;
            
}
            
strDecimal = strDecimal.Substring(0, length);
        
}
        
return 
Decimal.Parse(strDecimal);
    
}
 
    
/// <summary>
    
///  Decimal类型截取保留N位小数向上取
    
/// </summary>
    
/// <param name="d"></param>
    
/// <param name="n"></param>
    
/// <returns></returns>
    
public 
static 
decimal 
Ceiling(
decimal 
d, 
int 
n)
    
{
        
decimal 
t = 
decimal
.Parse(Math.Pow(10, n).ToString());
        
d = Math.Ceiling(t * d);
        
return 
d / t;
    
}
}

测试:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class 
Program
{
    
static 
void 
Main(
string
[] args)
    
{
        
Console.WriteLine();
        
decimal 
Dec = 12.12345M;
        
for 
(
int 
i = 0; i < 10; i++)
        
{
            
Console.WriteLine($
"{Dec} 保留{i} 位小数不进行四舍五入操作:" 
+ DecimalHelper.CutDecimalWithN(Dec, i));
        
}
        
Console.WriteLine();
        
for 
(
int 
i = 0; i < 10; i++)
        
{
            
Console.WriteLine($
"{Dec} 保留{i} 位小数向上取整操作:" 
+ DecimalHelper.Ceiling(Dec, i));
        
}
        
Console.Read();
    
}
}

博客内容仅代表个人观点,如发现阐述有误,麻烦指正,谢谢!
 
 
 
你可能感兴趣的文章
tomcat注册windows服务
查看>>
使用qq邮箱的smpt服务发送邮件一定要记得用ssl
查看>>
20个非常有用的Java代码片段
查看>>
转 ubuntu解压命令全览
查看>>
Android开发的前景分析——之你为何看好Android?
查看>>
linux学习笔记
查看>>
页面自动刷新
查看>>
No free lunch in search and optimization
查看>>
分析 Spring 的编程式事务管理及声明式事务管理(转)
查看>>
网站优化和竞价有什么区别
查看>>
MySQL开源热备工具XtraBackup的原理与程序说明
查看>>
mongoDB(1):windows下安装mongoDB(解压缩版)
查看>>
CentOS修改主机名
查看>>
php 5.3.6中php-fpm 配置
查看>>
XMPP协议分析-原理篇
查看>>
centos7常用操作
查看>>
系统集成资质培训 - 新书发布
查看>>
Ubuntu解决RTNETLINK answers: File exists
查看>>
ES6数组去重的最佳实践:Set结合Array.from() | 拓展运算符结合 Set
查看>>
深入屏幕像素概念
查看>>