C# 应用 - 封装类访问 Oracle 数据库
1. 引入库类
Oracle.ManagedDataAccess.dll
using Oracle.ManagedDataAccess.Client;
2. 粗暴封装
namespace xx
{
    public class OracleSqlDao
    {
        public OracleSqlDao(string connStr)
        {
            ConnectionString = connStr;
        }
        /// <summary>
        /// 数据库连接字符串
        /// </summary>
        public string ConnectionString;
        /// <summary>
        /// 使用固定连接进行数据库的操作,默认false,表示每次操作都使用新的连接
        /// </summary>
        public bool UseSpecifiedConn = false;
        /// <summary>
        /// 使用指定连接执行数据库操作时所用的数据库连接,使用前需设置UseSpecifiedConn
        /// </summary>
        public OracleConnection OrasqlConn;
        /// <summary>
        /// 打开数据库连接
        /// </summary>
        /// <returns></returns>
        public bool OpenConn()
        {
            try
            {
                if (OrasqlConn.State == ConnectionState.Open)
                {
                    return true;
                }
                else
                {
                    OrasqlConn.Open();
                    return OrasqlConn.State == ConnectionState.Open;
                }
            }
            catch (Exception ex)
            {
                Common.WriteLog.Error("打开数据库连接出错!", ex);
                return false;
            }
        }
        /// <summary>
        /// 关闭数据库连接
        /// </summary>
        /// <returns></returns>
        public bool CloseConn()
        {
            try
            {
                OrasqlConn.Close();
                return OrasqlConn.State == ConnectionState.Closed;
            }
            catch (Exception ex)
            {
                Common.WriteLog.Error("关闭数据库连接出错!", ex);
                return false;
            }
        }
        /// <summary>
        /// 检查数据库连接是否正常
        /// </summary>
        /// <returns></returns>
        public bool TryOpenConn()
        {
            bool result = false;
            using (OracleConnection Conn = new OracleConnection(ConnectionString))
            {
                try
                {
                    Conn.Open();
                    result = Conn.State == ConnectionState.Open;
                }
                catch (Exception ex)
                {
                    Common.WriteLog.Error("打开数据库连接出错!", ex);
                }
            }
            return result;
        }
        /// <summary>
        /// 查询 postgre 数据库,返回 DataTable 数据
        /// </summary>
        /// <param name="sqlText">sql查询语句</param>
        /// <returns></returns>
        public DataTable ExecuteQuery(string sqlText)
        {
            return ExecuteQuery(sqlText, null);
        }
        /// <summary>
        /// 查询 postgre 数据库,返回 DataTable 数据
        /// </summary>
        /// <param name="sqlText">sql查询语句</param>
        /// <param name="param">参数集合</param>
        /// <returns></returns>
        public DataTable ExecuteQuery(string sqlText, OracleParameter[] param)
        {
            var dt = new DataTable();
            OracleConnection conn = UseSpecifiedConn ? OrasqlConn : new OracleConnection(ConnectionString);
            using (var nda = new OracleDataAdapter(sqlText, conn))
            {
                try
                {
                    if (param != null)
                    {
                        SetParmDBNull(param);
                        nda.SelectCommand.Parameters.AddRange(param);
                    }
                    var ds = new DataSet();
                    nda.Fill(ds);
                    dt = ds.Tables[0];
                }
                catch (Exception ex)
                {
                    Common.WriteLog.Error("查询数据库出错!查询语句:" + sqlText, ex);
                }
                finally
                {
                    if (!UseSpecifiedConn)
                    {
                        conn.Dispose();
                    }
                }
            }
            return dt;
        }
        /// <summary>
        /// 查询唯一值(用来查总记录数等等..)
        /// </summary>
        /// <param name="sqlText"></param>
        /// <returns></returns>
        public int QueryOnly(string sqlText)
        {
            OracleConnection conn = UseSpecifiedConn ? OrasqlConn : new OracleConnection(ConnectionString);
            try
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }
                OracleCommand objCommand = new OracleCommand(sqlText, conn);
                int count = Convert.ToInt32(objCommand.ExecuteScalar());
                return count;
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
                return 0;
            }
            finally
            {
                if (!UseSpecifiedConn)
                {
                    conn.Dispose();
                }
            }
        }
        /// <summary>
        /// 增删改 postgre 数据库,返回是否成功标识
        /// </summary>
        /// <param name="sqlText"></param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sqlText)
        {
            return ExecuteNonQuery(sqlText, null);
        }
        /// <summary>
        /// 增删改 postgre 数据库,返回是否成功标识
        /// </summary>
        /// <param name="sqlText"></param>
        /// <param name="param">参数集合</param>
        /// <returns></returns>
        public int ExecuteNonQuery(string sqlText, OracleParameter[] param)
        {
            int result = int.MinValue;
            OracleConnection conn = UseSpecifiedConn ? OrasqlConn : new OracleConnection(ConnectionString);
            using (var nSqlCommand = new OracleCommand(sqlText, conn))
            {
                try
                {
                    if (conn.State != ConnectionState.Open)
                    {
                        conn.Open();
                    }
                    // 添加参数
                    if (param != null)
                    {
                        SetParmDBNull(param);
                        nSqlCommand.Parameters.AddRange(param);
                    }
                    // 执行查询并返回受影响的行数
                    result = nSqlCommand.ExecuteNonQuery();
                }
                catch (OracleException ex)
                {
                    Common.WriteLog.Error("执行数据库语句出错!执行语句:" + sqlText, ex);
                    if (ex != null)
                    {
                        result = ex.ErrorCode;
                    }
                }
                finally
                {
                    if (!UseSpecifiedConn)
                    {
                        conn.Dispose();
                    }
                }
            }
            return result;
        }
        /// <summary>
        /// 执行多条SQL语句,实现数据库事务。
        /// </summary>
        /// <param name="SQLStringList">多条SQL语句</param>
        public bool ExecuteTransSQL(List<String> SQLStringList)
        {
            using (OracleConnection conn = UseSpecifiedConn ? OrasqlConn : new OracleConnection(ConnectionString))
            {
                if (conn.State != ConnectionState.Open)
                    conn.Open();
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = conn;
                OracleTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            count += cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    return true;
                }
                catch
                {
                    tx.Rollback();
                    return false;
                }
                finally
                {
                    if (!UseSpecifiedConn)
                    {
                        conn.Dispose();
                    }
                }
            }
        }
        /// <summary>
        /// 将参数中null值转换为DBNull
        /// </summary>
        /// <param name="param"></param>
        public void SetParmDBNull(OracleParameter[] param)
        {
            foreach (var p in param)
            {
                if (p.Value == null)
                {
                    p.Value = DBNull.Value;
                }
            }
        }
        /// <summary>
        /// DataTable转换List,反射机制
        /// </summary>
        /// <param name="dt"></param>
        /// <returns></returns>
        public IList<T> DataTableToList<T>(DataTable dt) where T : new()
        {
            IList<T> list = new List<T>();// 定义集合
            Type type = typeof(T); // 获得此模型的类型
            var tempName = string.Empty;
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性
                foreach (PropertyInfo pi in propertys)
                {
                    tempName = pi.Name;
                    if (dt.Columns.Contains(tempName))
                    {
                        if (!pi.CanWrite) continue;
                        object value = dr[tempName];
                        if (value != DBNull.Value)
                            pi.SetValue(t, value, null);
                    }
                }
                list.Add(t);
            }
            return list;
        }
    }
}
3. 代码实例
/// <summary>
/// oracle
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnOra_Click(object sender, RoutedEventArgs e)
{
	OracleSqlDao ora = new OracleSqlDao("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.37.175)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=c3mits)));Persist Security Info=True;User ID=gosun;Password=video;");
	var result=ora.TryOpenConn();
	var table=ora.ExecuteQuery("select * from yunxingtest");
}
C# 应用 - 封装类访问 Oracle 数据库的更多相关文章
- .net(C#)访问Oracle数据库的几种免安装组件的对比
		Oracle 数据存取组件(ODAC) 库为Borland Delphi,C++ Builder 以及 Kylix提供了一些非可视化的组件.它们用来存取Oracle关系数据库系统.与BDE类似, OD ... 
- 用JDBC访问ORACLE数据库  关于commit  增快效率  大数据  等的整理
		1.问:用JDBC访问ORACLE数据库,做DELETE操作,能用JAVA多线程实现吗? ORACLE服务器要怎么配?(以下答案来自网络,仅供参考) 答: Oracle有自己的锁机制.就算你开100条 ... 
- .net(C#)访问Oracle数据库的几种免安装组件的对比(转)
		原文地址 [内容为转载,个人推荐还是用官方的组件,推荐使用 Oracle.DataAccess.dll ] .net(C#)编程过程中,使用到了以下三种免安装的Oracle访问组件,能够不安装Orac ... 
- 运行于64操作系统上的C#客户端通过WCF访问Oracle数据库不兼容问题
		运行平台: Windows 7 64位操作系统 运行环境: IIS 7 编程语言:C# 数据库: 32位的Oracle 10g 运行原因:64位操作系统C#客户端程序通过WCF访问ORACLE数据库 ... 
- ODP.NET 之访问 Oracle 数据库
		ODP.NET 之访问 Oracle 数据库 要相使用 Oracle Data Provider For .NET(ODP.NET), 必须先安装 ODP.NET 或者是 ODAC(Oracle Da ... 
- 【方法】如何限定IP访问Oracle数据库
		[方法]如何限定IP访问Oracle数据库 1.1 BLOG文档结构图 1.2 前言部分 1.2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知 ... 
- c#访问oracle数据库
		想在c#中访问oracle数据库,毕竟是开发,想要轻量级访问oracle,客户机上无需安装oracle环境就能正常运行程序. 在网上找了相关资料,只需要引用一个dll即可实现. 访问代码(需引用dll ... 
- WebService访问oracle数据库本地调试
		WebService访问oracle数据库本地调试-一步一个坑 上篇文章提到我们额数据库挂了,重装了数据库,然后呢我需要在本地调试WebService,看看那些数据结构缺失,迁移到新数据库中去.踩坑之 ... 
- Winform 利用 Oracle.ManagedDataAccess访问Oracle数据库
		Winform 利用 Oracle.ManagedDataAccess访问Oracle数据库时出现以下错误: Message = "每个配置文件中只允许存在一个 <configSect ... 
随机推荐
- k8s二进制部署 - master节点安装
			下载kubernetes服务端 [root@hdss7-21 ~]# cd /opt/src [root@hdss7-21 src]# wget https://dl.k8s.io/v1.15.2/k ... 
- Redis 哨兵高可用(Sentinel)
			哨兵机制是 Redis 高可用中重要的一环,其核心是 通过高可用哨兵集群,监控主从复制的健康状态,并实现自动灾备: 哨兵集群以集群的方式进行部署,这种分布式特性具有以下优点: 避免系统中存在单点,防止 ... 
- leetcode 122 123   309 188 714  股票买卖 动态规划
			这类问题有一个通法 https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/solution/yi-ge-tong-y ... 
- redis字符串-sds
			redis自己实现了一种名为简单动态字符串的抽象类型(simple dynamic string)作为字符串的表示.下面将简单介绍sds的实现原理. 一.sds的结构 
- vue 的 computed 属性在什么时间执行
			vue 的 computed 属性在什么时间执行 
- mobile app & ppi & dpi & px
			mobile app & ppi & dpi & px How do dp, dip, dpi, ppi, pixels and inches relate? https:// ... 
- server sent events
			server sent events server push https://html5doctor.com/server-sent-events/ https://developer.mozilla ... 
- 关于TCP的Total Length
			TCP/IP传输层 文档 随便找了个发送的TCP: 70 89 cc ee 84 2c 3c 2c 30 a6 a2 d0 08 00 45 00 00 4c c7 a8 40 00 80 06 00 ... 
- BGV崛起带动DeFi重回大众视野
			自10月份比特币二次发力以来,DeFi越来越被市场忽略,这当然也有比特币给力和DeFi低迷的双重原因,但随着Baccarat的平台币BGV于A网的正式上线,近期DeFi重新回到了大众的视野中. 正如区 ... 
- C++算法代码——级数求和[NOIP2002 普及组]
			题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1078 或者:https://www.luogu.com.cn/problem/P10 ... 
