众所周知vs.net提供了sqlserver、oledb、odbc等几种数据库连接驱动,现在比较常见的数据库连接类(如DBHelper等)只提供了其中一种连接方式,在我们开发的项目要更换数据库时或者在一个项目中要涉及多个不同类型的数据库时是非常麻烦的,通常要更改几乎所有的数据库连接相关代码。在经过几次痛苦之后,我决定打造一个通用的数据库连接类。

在查阅了相关资料之后我决定使用接口技术和.Net最新提供的通用数据库对象和配置文件来实现。关于使用接口技术,在查阅了MSDN文档之后我们得知.Net中各种数据库连接类( System.Data.SqlClient.SqlConnection、System.Data.OleDb.OleDbConnection 等)都是从System.Data.IDbConnection接口派生的,数据库连接类中的常用方法如打开连接Open()方法、得到Command对象的CreateCommand()方法、和数据库事务相关的BeginTransaction()方法、Commit()方法、Rollback()方法等在System.Data.IDbConnection接口中已经有定义。各种驱动类型的DataRader类也都是从System.Data.IDataReader接口派生的,DataRader的一些常用方法在接口中也都存在定义。

考虑到开发的灵活性,我们将数据库连接信息写在配置文件中,内容格式如下:

<connectionStrings>
    <add name="ConnectionString1" connectionString="Data Source=(local);Initial Catalog=db1;Persist Security Info=True;User ID=sa;Password=123" providerName="System.Data.SqlClient" />
    <add name="ConnectionString2" connectionString="Data Source=(local);Initial Catalog=db2;Persist Security Info=True;User ID=sa;Password=123" providerName="System.Data.SqlClient"/>
  </connectionStrings>

接下来再来考虑连接类的写法,考虑到一个项目中涉及到多个数据库情况,打开数据库连接的方法如下

/// <summary>
        /// 打开数据库连接
        /// </summary>
        /// <param name="connName">连接名</param>
        /// <returns></returns>
        static public System.Data.Common.DbConnection OpenConnect(string connName)
        {

System.Data.Common.DbConnection Conn;
            //得到配置文件中的连接信息
            System.Configuration.ConnectionStringSettings s = System.Configuration.ConfigurationManager.ConnectionStrings[connName];
            //得到驱动类型¨ª
            System.Data.Common.DbProviderFactory f = System.Data.Common.DbProviderFactories.GetFactory(s.ProviderName);
            Conn = f.CreateConnection();
            //得到连接字符串
            Conn.ConnectionString = s.ConnectionString;
            Conn.Open();
            return Conn;
        }
//OpenConnect(string connName)

OpenConnect方法需要传递连接名参数,这个参数是的值要与配置文件中的值匹配。通过调用OpenConnect方法,我们在同一个项目中可以随时打开多个不同的连接
得到了连接之后,接下来要解决查询的问题,为了通用性我们将连接对象作为参数传递。
/// <summary>
        /// 执行查询返回DataReader
        /// </summary>
        /// <param name="sql">Sql语句</param>
        /// <param name="Conn">连接对象</param>
        /// <returns>成功时返回Reader对象,失败时返回null</returns>
        static public System.Data.IDataReader ExecuteQuery(string sql, System.Data.Common.DbConnection Conn)
        {
            System.Data.IDataReader reader = null;
            if (Conn == null)
            {
                return null;
            }
            try
            {
                if (Conn.State == System.Data.ConnectionState.Closed)
                {
                    Conn.Open();
                }
                System.Data.IDbCommand cmd = Conn.CreateCommand();
                cmd.CommandText = sql;
                reader = cmd.ExecuteReader();
                return reader;
            }
            catch (Exception ex)
            {
                ClsDB.ErrLog("ClsDB.ExecuteQuery(string sql, System.Data.Common.DbConnection Conn):" + ex.Message);
                return null;
            }

}

下面是增删改的方法:
/// <summary>
        /// 执行Sql语句
        /// </summary>
        /// <param name="sql">Sql语句</param>
    ///<param name="Conn">数据库连接对象</param>
        /// <returns>返回受影响行数</returns>
    static public int Execute(string sql, System.Data.Common.DbConnection Conn)
        {
            if (Conn == null)
            {
                ClsDB.ErrLog("ClsDB.Execute(string sql, System.Data.Common.DbConnection Conn):连接对象为空!");
                return 0;
            }
            System.Data.IDbCommand cmd = Conn.CreateCommand();

cmd.CommandText = sql;
            try
            {
                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                ClsDB.ErrLog("ClsDB.ExecuteQuery(string sql, System.Data.Common.DbConnection Conn):" + ex.Message + "/nsql=" + sql);
                return 0;
            }
}

为了方便向数据库添加二进制数据,再写一个带参数的增删改方法:
/// <summary>
        /// 执行Sql语句?
        /// </summary>
        /// <param name="sql">Sql语句</param>
        /// <param name="Conn">数据库连接对象</param>
        /// <param name="param">参数</param>
        /// <returns>返回受影响行数</returns>
        static public int Execute(string sql, System.Data.Common.DbConnection Conn, System.Data.Common.DbParameter[] param)
        {
            if (Conn == null)
            {
                ClsDB.ErrLog("ClsDB.Execute(string sql, System.Data.Common.DbConnection Conn, System.Data.Common.DbParameter[] param):连接对象为空!");
                return 0;
            }
            System.Data.IDbCommand cmd = Conn.CreateCommand();
            cmd.CommandText = sql;
            for (int i = 0; i < param.Length; i++)
            {
                cmd.Parameters.Add(param[i]);
            }
            try
            {
                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                ClsDB.ErrLog("ClsDB.Execute(string sql, System.Data.Common.DbConnection Conn, System.Data.Common.DbParameter[] param):" + ex.Message + "/nsql=" + sql);
                return 0;
            }
        }
到这里就差不多了,下面附上完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace Common
{
    /// <summary>
    /// 支持连接池的数据库访问类
    /// </summary>
    public class ClsDB
    {
        public ClsDB()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }

/// <summary>
        /// 得到连接字符串
        /// </summary>
        /// <returns>连接字符串</returns>
        static private string getConnString(string key)
        {
            string connStr = System.Configuration.ConfigurationManager.ConnectionStrings[key].ToString();
            if (connStr == null || connStr == "")
            {
                ClsDB.ErrLog("ClsDB.getConnString(string key):["+key+"]所指定的连接类型为空");
            }
            return connStr;
        }
        /// <summary>
        /// 打开数据库连接
        /// </summary>
        /// <param name="connName">连接名</param>
        /// <returns></returns>
        static public System.Data.Common.DbConnection OpenConnect(string connName)
        {

System.Data.Common.DbConnection Conn;
            //得到配置文件中的连接信息
            System.Configuration.ConnectionStringSettings s = System.Configuration.ConfigurationManager.ConnectionStrings[connName];
            //得到驱动类型
            System.Data.Common.DbProviderFactory f = System.Data.Common.DbProviderFactories.GetFactory(s.ProviderName);
            Conn = f.CreateConnection();
            //得到连接字符串
            Conn.ConnectionString = s.ConnectionString;
            Conn.Open();
            return Conn;
        }//OpenConnect(string connName)

/// <summary>
        /// 执行查询返回DataTable
        /// </summary>
        /// <param name="sql">Sql语句</param>
        /// <returns>成功返回DataTable,失败则返回 null</returns>
        static public System.Data.DataTable ExecuteQueryToDataTable(string sql, System.Data.Common.DbConnection Conn)
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            System.Data.IDataReader reader = ExecuteQuery(sql, Conn);
            dt.Load(reader);
            return dt;
           
        }//ExecuteQueryToDataTable(string sql)

/// <summary>
        /// 执行查询返回DataReader
        /// </summary>
        /// <param name="sql">Sql语句</param>
        /// <param name="Conn">连接对象</param>
        /// <returns>成功时返回Reader对象,失败时返回null</returns>
        static public System.Data.IDataReader ExecuteQuery(string sql, System.Data.Common.DbConnection Conn)
        {
            System.Data.IDataReader reader = null;
            if (Conn == null)
            {
                return null;
            }
            try
            {
                if (Conn.State == System.Data.ConnectionState.Closed)
                {
                    Conn.Open();
                }
                System.Data.IDbCommand cmd = Conn.CreateCommand();
                cmd.CommandText = sql;
                reader = cmd.ExecuteReader();
                return reader;
            }
            catch (Exception ex)
            {
                ClsDB.ErrLog("ClsDB.ExecuteQuery(string sql, System.Data.Common.DbConnection Conn):" + ex.Message);
                return null;
            }

}//ExecuteQuery(string sql)

/// <summary>
        /// 执行Sql语句
        /// </summary>
        /// <param name="sql">Sql语句</param>
        /// <param name="Conn">数据库连接对象</param>
        /// <returns>返回受影响行数</returns>
        static public int Execute(string sql, System.Data.Common.DbConnection Conn)
        {
            if (Conn == null)
            {
                ClsDB.ErrLog("ClsDB.Execute(string sql, System.Data.Common.DbConnection Conn):连接对象为空!");
                return 0;
            }
            System.Data.IDbCommand cmd = Conn.CreateCommand();

cmd.CommandText = sql;
            try
            {
                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                ClsDB.ErrLog("ClsDB.ExecuteQuery(string sql, System.Data.Common.DbConnection Conn):" + ex.Message + "/nsql=" + sql);
                return 0;
            }
        }//Execute(string sql)

/// <summary>
        /// 执行Sql语句
        /// </summary>
        /// <param name="sql">Sql语句</param>
        /// <param name="Conn">数据库连接对象</param>
        /// <param name="param">参数</param>
        /// <returns>返回受影响行数</returns>
        static public int Execute(string sql, System.Data.Common.DbConnection Conn, System.Data.Common.DbParameter[] param)
        {
            if (Conn == null)
            {
                ClsDB.ErrLog("ClsDB.Execute(string sql, System.Data.Common.DbConnection Conn, System.Data.Common.DbParameter[] param):连接对象为空!");
                return 0;
            }
            System.Data.IDbCommand cmd = Conn.CreateCommand();
            cmd.CommandText = sql;
            for (int i = 0; i < param.Length; i++)
            {
                cmd.Parameters.Add(param[i]);
            }
            try
            {
                return cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                ClsDB.ErrLog("ClsDB.Execute(string sql, System.Data.Common.DbConnection Conn, System.Data.Common.DbParameter[] param):" + ex.Message + "/nsql=" + sql);
                return 0;
            }
        }//Execute(string sql,System.Data.IDataParameter[] param)

/// <summary>
        /// 执行一个事务
        /// </summary>
        /// <param name="sqls">Sql语句组</param>
        /// <returns>成功时返回true</returns>
        static public bool ExecuteTrans(string[] sqls, System.Data.Common.DbConnection Conn)
        {
            System.Data.IDbTransaction myTrans;
            if (Conn == null)
            {
                ClsDB.ErrLog("ClsDB.ExecuteTrans(string[] sqls):连接对象为空!");
                return false;
            }
            System.Data.IDbCommand cmd = Conn.CreateCommand();
            myTrans = Conn.BeginTransaction();
            cmd.Transaction = myTrans;
            try
            {
                foreach (string sql in sqls)
                {
                    if (sql != null)
                    {
                        cmd.CommandText = sql;
                        cmd.ExecuteNonQuery();
                    }
                }
                myTrans.Commit();
            }
            catch (Exception ex)
            {
                myTrans.Rollback();
                ClsDB.ErrLog("ClsDB.ExecuteTrans(string[] sqls):" + ex.Message);
                return false;
            }
            return true;
        }//Execute(string sql)

/// <summary>
        /// 记录错误信息
        /// </summary>
        /// <param name="ErrInfo">错误信息</param>
        private static void ErrLog(string ErrInfo)
        {
            string fileName = System.Configuration.ConfigurationManager.AppSettings["ErrorLogFile"];
            string isWrite = System.Configuration.ConfigurationManager.AppSettings["ErrorLog"].Trim().ToLower();
            if (isWrite == "yes")
            {
                //将错误信息写入系统日志
                //System.Diagnostics.EventLog log = new System.Diagnostics.EventLog();
                //log.Source = "NewFrame";
                //log.WriteEntry(ErrInfo);
                //将错误信息写入记录文件
                StreamWriter sw = new StreamWriter(fileName, true);
                sw.WriteLine(System.DateTime.Now);
                sw.WriteLine(ErrInfo);
                sw.WriteLine();
                sw.Close();
            }
        }//ErrLog(string ErrInfo)

}
}

使用C#打造通用的数据库连接类相关推荐

  1. 使用设计模式构建通用数据库访问类

    在应用程序的设计中,数据库的访问是非常重要的,我们通常需要将对数据库的访问集中起来,以保证良好的封装性和可维护性.在.Net中,数据库的访问,对于微软自家的SqlServer和其他数据库(支持OleD ...

  2. 简单程序所需要的简单 asp.net通用数据库访问类

    简单程序不需要分层,各页面共用相同的通用数据库访问类即可 using System;  using System.Data;  using System.Data.SqlClient; namespa ...

  3. jdbc增删改查有哪些步骤_JDBC打造通用增删改方法

    [JDBC]打造通用增删改方法原创 简介:在我们学习JDBC的时候或者编写简单的Servlet程序的时候,经常需要增删改查等操作,很多小伙伴的做法是:增删改查各写一个方法,这样写虽然可以实现我们想要的 ...

  4. 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫...

    前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,这样很容易被服务器封IP,因此需要设置IP代理,但又不想花钱买,网上有免费IP代理,但大多都数都是不可 ...

  5. 最新web/springboot打造通用的短信验证码微服务(详细)

    前言 很久之前的一篇文章, 最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细),截止到目前,依然有很多小伙伴,私信需要帮助,于是我再加一篇,让大家能更好的使用.(当然 ...

  6. 施路平教授:面向人工通用智能的类脑计算

    在2019年10月31日的北京智源大会"智能体系架构与芯片专题论坛"中,清华大学类脑计算研究中心主任施路平教授为我们分享了题为<面向人工通用智能的类脑计算>的主题演讲. ...

  7. 自己写的Python数据库连接类和sql语句拼接方法

    这个工具类十分简单和简洁. sql拼接方法 # encoding=utf-8 from django.http import HttpResponse from anyjson import seri ...

  8. php SQLite mysql_PHP实现的sqlite数据库连接类

    本文实例讲述了PHP实现的sqlite数据库连接类.分享给大家供大家参考.具体实现方法如下: 该sqlite数据库连接类就是利用了php与sqlite进行连接操作,代码如下: */ lass db_c ...

  9. ASP.NET2.0通用数据访问类

    .NET框架自带的数据提供器包括SQLServer(System.Data.SqlClient).Oracle    (System.Data.Oracleclient).OLEDB(System.D ...

最新文章

  1. c语言用数组实现栈的插入,C语言静态数组实现栈操作
  2. 【Linux】一步一步学Linux——grep命令(49)
  3. Python中常见的语法糖
  4. JavaScript 使用对象及ES6中的class
  5. 玩转 HMS Core 6.0,详解开发者该知道的黑科技……
  6. Open***服务器端配置文件server.conf的说明
  7. 获取某网站在alexa上的排名
  8. SQL手工注入笔记1
  9. 华为HCNA路由与交换eNSP实战(1)静态路由基础
  10. # [cs231n (五)神经网络part 1 构建架构 ][1]
  11. 文墨绘学书法教育领导品牌
  12. 【超简易】网站ioc图标添加【超详细】
  13. 简单的纯JS小游戏--消灭星星
  14. AutoFac在WinForm中的使用
  15. 揭秘:QQ号码能准确测出QQ主人年龄问题
  16. 马斯洛的五大需求层次理论
  17. 第68届柏林国际电影节组委会日前公布了电影名单
  18. 集成电路版图学习笔记1----版图基本知识
  19. 机器人运动学-DH法建模
  20. EPG开发《异常排查以及解决方案》

热门文章

  1. iQOO骑士黑版本四月亮相:搭载骁龙855+12G运存
  2. Android深入理解Fragment
  3. nodejs 最简单的文件接收
  4. linux删除php文件权限不够,linux - 用php的exec()删除目录文件提示权限不够
  5. nodejs实践录:windows 10系统nodejs环境搭建
  6. pelco协议及其实现的简单认识
  7. Windows下的Makefile
  8. Linux无网络升级gcc,Linux离线(手动)升级GCC
  9. 【kafka】kafka 数据重复的一个 案例
  10. 【Flink】Flink + Drools 构建规则模型