众所周知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)