服务端配置
如果不想自己写,可以通过 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配置的名称
前言
FontAwesome 大家都不陌生,精美的图标,出现在各式各样的网页中。
最近在做 Windows Forms 应用程序,要求美观,就想能不能把 FontAwesome 图标用上,于是就有了本文。本人已经将 FontAwesome 进行了封装,并上传到了 GitHub 和 NuGet。
- GitHub:
- 码云:
- NuGet:
样图
简介
下面是解决方案列表:
|- .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 ...
如有不好的地方,欢迎大家更正,谢谢。
Q:
在反序列化 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 的位置即可。
这里就是在 上面注释的地方。
前言
在开发应用程序时,通常只让程序运行一个实例。所以,就要判断程序是否已经运行。
下面是我自己在项目中使用到,封装好的帮助类。有 普通的 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... } } } }
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(); } } |