Oracle 远程访问配置

 

服务端配置

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

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

1.网络监听配置

  1. # listener.ora Network Configuration File: C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora
  2. # Generated by Oracle configuration tools.
  3. SID_LIST_LISTENER =
  4. (SID_LIST =
  5. (SID_DESC =
  6. (SID_NAME = CLRExtProc)
  7. (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)
  8. (PROGRAM = extproc)
  9. (ENVS = "EXTPROC_DLLS=ONLY:C:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
  10. )
  11. )
  12. LISTENER =
  13. (DESCRIPTION_LIST =
  14. (DESCRIPTION =
  15. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  16. (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  17. )
  18. )
  19. ADR_BASE_LISTENER = C:\app\Administrator

多个IP时,如下:

  1. LISTENER =
  2. (DESCRIPTION_LIST =
  3. (DESCRIPTION =
  4. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  5. )
  6. (DESCRIPTION =
  7. (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.226.2)(PORT = 1521))
  8. )
  9. (DESCRIPTION =
  10. (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.226.3)(PORT = 1521))
  11. )
  12. )

2.TNS 配置

  1. # tnsnames.ora Network Configuration File: C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\tnsnames.ora
  2. # Generated by Oracle configuration tools.
  3. ORCL=
  4. (DESCRIPTION =
  5. (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
  6. (CONNECT_DATA =
  7. (SERVER = DEDICATED)
  8. (SERVICE_NAME = orcl)
  9. )
  10. )
  11. ORACLR_CONNECTION_DATA =
  12. (DESCRIPTION =
  13. (ADDRESS_LIST =
  14. (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
  15. )
  16. (CONNECT_DATA =
  17. (SID = CLRExtProc)
  18. (PRESENTATION = RO)
  19. )
  20. )
  21. LISTENER_ORCL =
  22. (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

多个IP时,如下:

  1. ORCL =
  2. (DESCRIPTION =
  3. (ADDRESS_LIST =
  4. (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.226.2)(PORT = 1521))
  5. (ADDRESS = (PROTOCOL = TCP)(HOST = 172.24.226.3)(PORT = 1521))
  6. )
  7. (SOURCE_ROUTE = yes)
  8. (CONNECT_DATA =
  9. (SERVER = DEDICATED)
  10. (SERVICE_NAME = orcl)
  11. )
  12. )

3.停止和启动服务

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

  • OracleOraDb11g_homeTNSListener
  • OracleService*

客户端配置

1.下载 ODAC 压缩包.

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

3.执行安装命令
示例:

  1. 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 中加入

  1. DBORCL =
  2. (DESCRIPTION =
  3. (ADDRESS = (PROTOCOL = TCP)(HOST = <db-host>)(PORT = 1521))
  4. (CONNECT_DATA =
  5. (SERVER = DEDICATED)
  6. (SERVICE_NAME = <db-name>)
  7. )
  8. )

说明:

  • <db-host> : 数据库电脑的IP或者是计算机名
  • <db-name> : 数据库TNS配置的名称

本作品由SeayXu创作,采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
基于http://www.cnblogs.com/seayxu上的作品创作。
可自由转载、引用,但需署名作者且注明文章出处,并以相同方式共享。
 
 
 

在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标

 

前言

FontAwesome 大家都不陌生,精美的图标,出现在各式各样的网页中。
最近在做 Windows Forms 应用程序,要求美观,就想能不能把 FontAwesome 图标用上,于是就有了本文。

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

样图

简介

下面是解决方案列表:

  1. |- .nuget
  2. |- sample
  3. |--- FontAwesomeNet.Sample # Windows Forms Samlpe
  4. |--- FontAwesomeNet.Wpf.Sample # WPF Samlpe
  5. |- src
  6. |--- FontAwesomeNet # FontAwesome for .NET library

使用

可以参考示例源码。

0. 安装字体

安装过请忽略,地址是:fontawesome-webfont-4.7.0.ttf

1. 安装类库

  1. PM> Install-Package FontAwesomeNet

2. 添加命名空间

  1. using FontAwesomeNet;

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

使用的是 FontAwesome 静态类。

获取字体图标名称:

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

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

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

获取图片和图标:

只有这两个方法。

  1. Bitmap bmp = FontAwesome.GetImage(val);//0xf004
  2. Icon ico = FontAwesome.GetIcon(val);//0xf004

修改默认参数:

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

  1. FontAwesome.IconSize = 128;//change icon size
  2. FontAwesome.ForeColer = Color.Purple;//change icon forecolor
  3. ...

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


本作品由SeayXu创作,采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
基于http://www.cnblogs.com/seayxu上的作品创作。
可自由转载、引用,但需署名作者且注明文章出处,并以相同方式共享。
 
 
 

C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”

 

Q:

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

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

A:

首先看下代码:

  1. StringBuilder sb = new StringBuilder();
  2. using (MemoryStream stream = new MemoryStream())
  3. {
  4. StreamWriter writer = new StreamWriter(stream);
  5. writer.Write(sb.ToString().Trim());
  6. writer.Flush();
  7. //stream.Position=0;
  8. // or
  9. //stream.Seek(0, SeekOrigin.Begin);
  10. StreamReader reader = new StreamReader(stream);
  11. XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
  12. object obj = xmlSerializer.Deserialize(reader);
  13. reader.Close();
  14. reader.Close();
  15. writer.Close();
  16. writer.Dispose();
  17. }

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

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

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


本作品由SeayXu创作,采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
基于http://www.cnblogs.com/seayxu上的作品创作。
可自由转载、引用,但需署名作者且注明文章出处,并以相同方式共享。
 
 

C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper

 

前言

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

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

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

普通 C# 应用程序

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

1. 使用 System.Threading.Mutex 类

参考:Mutex 类(System.Threading)

  1. using System.Threading;
  2. namespace XY.Util.Helper
  3. {
  4. /// <summary>
  5. /// Mutex helper
  6. /// </summary>
  7. public class MutexHelper
  8. {
  9. /// <summary>
  10. /// 判断程序是否已经运行
  11. /// <param name="assembly">程序集实例</param>
  12. /// </summary>
  13. /// <returns>
  14. /// true: 程序已运行
  15. /// false: 程序未运行
  16. /// </returns>
  17. public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
  18. {
  19. string strAppName = assembly.GetName().Name;
  20. return IsApplicationOnRun(strAppName);
  21. }
  22. /// <summary>
  23. /// 判断程序是否已经运行
  24. /// <param name="assemblyName">程序名称</param>
  25. /// </summary>
  26. /// <returns>
  27. /// true: 程序已运行
  28. /// false: 程序未运行
  29. /// </returns>
  30. public static bool IsApplicationOnRun(string assemblyName)
  31. {
  32. bool ret = false;
  33. //第一个参数:true--给调用线程赋予互斥体的初始所属权
  34. //第一个参数:互斥体的名称
  35. //第三个参数:返回值,如果调用线程已被授予互斥体的初始所属权,则返回true
  36. Mutex mutex = new Mutex(true, assemblyName, out ret);
  37. return !ret;
  38. }
  39. }
  40. }

2. 使用 Win32 API

  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace XY.Util.Helper
  4. {
  5. /// <summary>
  6. /// Mutex helper
  7. /// </summary>
  8. public class MutexHelper
  9. {
  10. [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
  11. public static extern IntPtr OpenMutex(uint dwDesiredAccess, bool bInitialOwner, string lpName);
  12. [DllImport("Kernel32.dll", CharSet = CharSet.Auto)]
  13. public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);
  14. /// <summary>
  15. /// 判断程序是否已经运行
  16. /// <param name="assembly">程序集实例</param>
  17. /// </summary>
  18. /// <returns>
  19. /// true: 程序已运行
  20. /// false: 程序未运行
  21. /// </returns>
  22. public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
  23. {
  24. string strAppName = assembly.GetName().Name;
  25. return IsApplicationOnRun(strAppName);
  26. }
  27. /// <summary>
  28. /// 判断程序是否已经运行
  29. /// <param name="assemblyName">程序名称</param>
  30. /// </summary>
  31. /// <returns>
  32. /// true: 程序已运行
  33. /// false: 程序未运行
  34. /// </returns>
  35. public static bool IsApplicationOnRun(string assemblyName)
  36. {
  37. bool ret = false;
  38. if (OpenMutex(0x1F0001, false, assemblyName) == IntPtr.Zero)
  39. {
  40. CreateMutex(IntPtr.Zero, false, assemblyName);
  41. ret = true;
  42. }
  43. return ret;
  44. }
  45. }
  46. }

Windows CE | Windows Mobile 应用程序

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

参考:

  1. using System;
  2. using System.Runtime.InteropServices;
  3. namespace XY.Util.Helper
  4. {
  5. /// <summary>
  6. /// Mutex helper
  7. /// </summary>
  8. public class MutexHelper
  9. {
  10. [DllImport("coredll.dll", EntryPoint = "CreateMutex", SetLastError = true)]
  11. public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool bInitialOwner, string lpName);
  12. [DllImport("coredll.dll", EntryPoint = "ReleaseMutex", SetLastError = true)]
  13. public static extern bool ReleaseMutex(IntPtr hMutex);
  14. private const int ERROR_ALREADY_EXISTS = 0183;
  15. /// <summary>
  16. /// 判断程序是否已经运行
  17. /// <param name="assembly">程序集实例</param>
  18. /// </summary>
  19. /// <returns>
  20. /// true: 程序已运行
  21. /// false: 程序未运行
  22. /// </returns>
  23. public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
  24. {
  25. string strAppName = assembly.GetName().Name;
  26. return IsApplicationOnRun(strAppName);
  27. }
  28. /// <summary>
  29. /// 判断程序是否已经运行
  30. /// <param name="assemblyName">程序名称</param>
  31. /// </summary>
  32. /// <returns>
  33. /// true: 程序已运行
  34. /// false: 程序未运行
  35. /// </returns>
  36. public static bool IsApplicationOnRun(string assemblyName)
  37. {
  38. IntPtr hMutex = CreateMutex(IntPtr.Zero, true, assemblyName);
  39. if (hMutex == IntPtr.Zero)
  40. {
  41. throw new ApplicationException("Failure creating mutex: " + Marshal.GetLastWin32Error().ToString("X"));
  42. }
  43. if (Marshal.GetLastWin32Error() == ERROR_ALREADY_EXISTS)
  44. {
  45. ReleaseMutex(hMutex);
  46. return true;
  47. }
  48. return false;
  49. }
  50. }
  51. }

示例代码

调用示例:

  1. using System;
  2. using System.Reflection;
  3. using XY.Util.Helper;
  4. namespace MutexTest
  5. {
  6. static class Program
  7. {
  8. [MTAThread]
  9. static void Main(string[] args)
  10. {
  11. bool run;
  12. //方式一
  13. run = MutexHelper.IsApplicationOnRun("ApplicationName");
  14. //方式二
  15. run = MutexHelper.IsApplicationOnRun(Assembly.GetExecutingAssembly());
  16. if (run)
  17. {
  18. // application is running...
  19. // Exit.
  20. }
  21. else
  22. {
  23. // start application ...
  24. // startup...
  25. }
  26. }
  27. }
  28. }

本作品由SeayXu创作,采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
基于http://www.cnblogs.com/seayxu上的作品创作。
可自由转载、引用,但需署名作者且注明文章出处,并以相同方式共享。
 
 

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

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();
    }
}

博客内容仅代表个人观点,如发现阐述有误,麻烦指正,谢谢!
 
 
 

Oracle 远程访问配置 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标 C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素” C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作的更多相关文章

  1. C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper

    前言 在开发应用程序时,通常只让程序运行一个实例.所以,就要判断程序是否已经运行. 下面是我自己在项目中使用到,封装好的帮助类.有 普通的 C# 应用程序 和 Windows CE 和 Windows ...

  2. 在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标

    前言 FontAwesome 大家都不陌生,精美的图标,出现在各式各样的网页中. 最近在做 Windows Forms 应用程序,要求美观,就想能不能把 FontAwesome 图标用上,于是就有了本 ...

  3. C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”

    Q: 在反序列化 Xml 字符串为 Xml 对象时,抛出如下异常. 即在 XML文档(0, 0)中有一个错误:缺少根元素. A: 首先看下代码: StringBuilder sb = new Stri ...

  4. C# WINFORM判断程序是否运行,且只能运行一个实例(转)

    判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种, 方法1:线程互斥 static class Program { private static System.Threading. ...

  5. winform判断程序是否运行,且只能运行一个实例

    前言 判断程序是否已经运行,使程序只能运行一个实例有很多方法,下面记录两种. 目前使用的是第一种方法. 方法1:线程互斥 static class Program { private static S ...

  6. C#让应用程序只运行一个实例的几种方法

    一 判断是否有相同的实例已经运行 1 根据“Mutex”判断是否有相同的实例在运行 /// <returns>已有实例运行返回true,否则为false</returns>pu ...

  7. 让程序同时只能运行一个C++ Builder实现(转)

    源:让程序同时只能运行一个 很多人都讨论过这个问题, 这里用Victor串口控件里面现成的共享内存功能来实现. 当程序运行第二次时只是激活第一次运行的窗口, 而不是再运行一个程序. 需要在主程序里实现 ...

  8. 如何用Qt写一个同一时间只能运行一个实例的应用程序

    http://blog.sina.com.cn/s/blog_6343941a0100nk2x.html 可以达到的目的: 1.应用只启动一个实例,依赖于QtNetwork模块 2.启动时向另一个实例 ...

  9. Java程序只运行一个实例[转]

    如果希望你的Java程序只能存在一个实例,可以参考下面的用法. 原文链接:http://blog.csdn.net/yaerfeng/article/details/7264729 Java没有提供这 ...

随机推荐

  1. CAD设置背景图片(com接口)

    把图片作为背景图片可见但是不能编辑操作. 主要用到函数说明: _DMxDrawX::DrawImageToBackground 绘光栅图到背景.详细说明如下: 参数 说明 BSTR sFileName ...

  2. CentOS7 export命令

    一.windows下的环境变量 在windows系统下,很多软件安装都需要配置环境变量,比如安装jdk,假如你没有配置环境变量,那么在非软件安装的目录下使用javac命令,系统将会报这不是系统内部命令 ...

  3. 如何系统学习并且掌握JavaScript

  4. 微信sdk 签名

    <?php namespace app\wechat\service; use think\Config; class Signature { protected $appId ; protec ...

  5. scrapy实现全站抓取数据

    1. scrapy.CrawlSpider scrapy框架提供了多种类型的spider,大致分为两类,一类为基本spider(scrapy.Spider),另一类为通用spider(scrapy.s ...

  6. python爬虫框架—Scrapy安装及创建项目

    linux版本安装 pip3 install scrapy 安装完成 windows版本安装 pip install wheel 下载twisted,网址:http://www.lfd.uci.edu ...

  7. 3.2.11 行 vs 字符串

        了解行(line)与字符串(string)的差异是相当重要的.大部分简易程序都是处理输入数据的行,像 grep 与 egrep,以及 sed 大部分的工作(99%)都是这样.在这些情况下,不会 ...

  8. WSS、SSL 和 https 之间的关系

    SSL SSL(Secure Socket Layer,安全套接层) 简单来说是一种加密技术, 通过它, 我们可以在通信的双方上建立一个安全的通信链路, 因此数据交互的双方可以安全地通信, 而不需要担 ...

  9. dva使用及项目搭建

    一.简介 本文将简单分析dva脚手架的使用及项目搭建过程. 首先,dva是一个基于redux和redux-saga的数据流方案,然后为了简化开发体验,dva还额外内置了react-router和fet ...

  10. C#上位机开发(三)—— 构建SerialAssistant雏形

    上一篇简单介绍了C#的一些基本知识,并成功的Hello,World,那么从这篇开始,我们来自己动手写一个串口助手: 1.构思功能 串口助手在单片机开发中经常被用来调试,最基本的功能就是接收功能和发送功 ...