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

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

Oracle 远程访问配置

服务端配置

如果不想自己写,可以通过 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 = <db-host>)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = <db-name>)
    )
  )

说明:

  • <db-host> : 数据库电脑的IP或者是计算机名
  • <db-name> : 数据库TNS配置的名称
Oracle 远程访问配置    在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标    C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”   C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper    Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作
本作品由SeayXu创作,采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
基于http://www.cnblogs.com/seayxu上的作品创作。
可*转载、引用,但需署名作者且注明文章出处,并以相同方式共享。

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

前言

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

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

样图

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

简介

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

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

使用

可以参考示例源码。

0. 安装字体

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

1. 安装类库

PM> Install-Package FontAwesomeNet

2. 添加命名空间

using FontAwesomeNet;

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

使用的是 FontAwesome 静态类。

获取字体图标名称:

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

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

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

获取图片和图标:

只有这两个方法。

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

修改默认参数:

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

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

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

Oracle 远程访问配置    在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标    C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”   C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper    Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作
本作品由SeayXu创作,采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
基于http://www.cnblogs.com/seayxu上的作品创作。
可*转载、引用,但需署名作者且注明文章出处,并以相同方式共享。

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

Q:

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

即在 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 的位置即可。

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

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

using System.Threading;

namespace XY.Util.Helper
{
    /// <summary>
    /// Mutex helper
    /// </summary>
    public class MutexHelper
    {
        /// <summary>
        /// 判断程序是否已经运行
        /// <param name="assembly">程序集实例</param>
        /// </summary>
        /// <returns>
        /// true: 程序已运行
        /// false: 程序未运行
        /// </returns>
        public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
        {
            string strAppName = assembly.GetName().Name;
            return IsApplicationOnRun(strAppName);
        }

        /// <summary>
        /// 判断程序是否已经运行
        /// <param name="assemblyName">程序名称</param>
        /// </summary>
        /// <returns>
        /// true: 程序已运行
        /// false: 程序未运行
        /// </returns>
        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
{
    /// <summary>
    /// Mutex helper
    /// </summary>
    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);

        /// <summary>
        /// 判断程序是否已经运行
        /// <param name="assembly">程序集实例</param>
        /// </summary>
        /// <returns>
        /// true: 程序已运行
        /// false: 程序未运行
        /// </returns>
        public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
        {
            string strAppName = assembly.GetName().Name;
            return IsApplicationOnRun(strAppName);
        }

        /// <summary>
        /// 判断程序是否已经运行
        /// <param name="assemblyName">程序名称</param>
        /// </summary>
        /// <returns>
        /// true: 程序已运行
        /// false: 程序未运行
        /// </returns>
        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
{
    /// <summary>
    /// Mutex helper
    /// </summary>
    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;

        /// <summary>
        /// 判断程序是否已经运行
        /// <param name="assembly">程序集实例</param>
        /// </summary>
        /// <returns>
        /// true: 程序已运行
        /// false: 程序未运行
        /// </returns>
        public static bool IsApplicationOnRun(System.Reflection.Assembly assembly)
        {
            string strAppName = assembly.GetName().Name;
            return IsApplicationOnRun(strAppName);
        }

        /// <summary>
        /// 判断程序是否已经运行
        /// <param name="assemblyName">程序名称</param>
        /// </summary>
        /// <returns>
        /// true: 程序已运行
        /// false: 程序未运行
        /// </returns>
        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...
            }
        }
    }
}
Oracle 远程访问配置    在 Windows Forms 和 WPF 应用中使用 FontAwesome 图标    C#反序列化XML异常:在 XML文档(0, 0)中有一个错误“缺少根元素”   C#[Win32&WinCE&WM]应用程序只能运行一个实例:MutexHelper    Decimal类型截取保留N位小数向上取, Decimal类型截取保留N位小数并且不进行四舍五入操作
本作品由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位小数并且不进行四舍五入操作

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