.NET通用的数据库操作类(支持多种数据库)

通用的数据库操作类(支持多种数据库)

      我们在软件开发过程中,数据库是一个永久不变的话题,但是根据软件架构与客户要求的不同我们会选择不同的数据库,在C#中不同数据库操作编写代码不尽相同,下面提供一种通用的数据库操作方案,只需要根据config的配置就可以动态的选择不同的数据库.

在配置文件中providerName指定不同的数据库类型.

<connectionStrings>
        <add name="ConnectionString"  connectionString=" ..." providerName="System.Data.OleDb" />

        <add name="ConnectionString"  connectionString=" ..." providerName="System.Data.SqlClient" />
 </connectionStrings>

代码如下:

 


using System;
using System.Collections;
using System.Collections.Specialized;
using System.Data;
using System.Configuration;
using System.Data.Common;

namespace DataBase
{
    
/// <summary>
    
/// 数据访问基础类
    
/// </summary>
    class DataHelper
    {
        
protected static string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        DbProviderFactory provider;
        
public DataHelper()
        {
            provider 
= DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings["ConnectionString"].ProviderName);
        }

        
#region  执行简单SQL语句

        
/// <summary>
        
/// 执行SQL语句,返回影响的记录数
        
/// </summary>
        
/// <param name="SQLString">SQL语句</param>
        
/// <returns>影响的记录数</returns>
        public int ExecuteSql(string SQLString)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                
using (DbCommand cmd = provider.CreateCommand())
                {
                    cmd.Connection 
= connection;
                    cmd.CommandText 
= SQLString;
                    
try
                    {
                        connection.Open();
                        
int rows = cmd.ExecuteNonQuery();
                        
return rows;
                    }
                    
catch (DbException E)
                    {
                        connection.Close();
                        connection.Dispose();
                        
throw new Exception(E.Message);
                    }
                }
            }
        }

        
/// <summary>
        
/// 执行多条SQL语句,实现数据库事务。
        
/// </summary>
        
/// <param name="SQLStringList">多条SQL语句</param>        
        public void ExecuteSqlTran(ArrayList SQLStringList)
        {
            
using (DbConnection conn = provider.CreateConnection())
            {
                conn.ConnectionString 
= connectionString;
                conn.Open();
                
using (DbCommand cmd = provider.CreateCommand())
                {
                    cmd.Connection 
= conn;
                    
using (DbTransaction tx = conn.BeginTransaction())
                    {
                        cmd.Transaction 
= tx;
                        
try
                        {
                            
for (int n = 0; n < SQLStringList.Count; n++)
                            {
                                
string strsql = SQLStringList[n].ToString();
                                
if (strsql.Trim().Length > 1)
                                {
                                    cmd.CommandText 
= strsql;
                                    cmd.ExecuteNonQuery();
                                }
                            }
                            tx.Commit();
                        }
                        
catch (DbException ex)
                        {
                            tx.Rollback();
                            conn.Close();
                            conn.Dispose();
                            
throw ex;
                        }
                    }
                }
            }
        }
        
/// <summary>
        
/// 执行一条计算查询结果语句,返回查询结果(object)。
        
/// </summary>
        
/// <param name="SQLString">计算查询结果语句</param>
        
/// <returns>查询结果(object)</returns>
        public object GetSingle(string SQLString)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                
using (DbCommand cmd = provider.CreateCommand())
                {
                    cmd.Connection 
= connection;
                    cmd.CommandText 
= SQLString;
                    
try
                    {
                        connection.Open();
                        
object obj = cmd.ExecuteScalar();
                        
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            
return null;
                        }
                        
else
                        {
                            
return obj;
                        }
                    }
                    
catch (DbException e)
                    {
                        connection.Close();
                        connection.Dispose();
                        
throw new Exception(e.Message);
                    }
                }
            }
        }
        
/// <summary>
        
/// 执行查询语句,返回SqlDataReader
        
/// </summary>
        
/// <param name="strSQL">查询语句</param>
        
/// <returns>SqlDataReader</returns>
        public DbDataReader ExecuteReader(string strSQL)
        {
            DbConnection connection 
= provider.CreateConnection();
            connection.ConnectionString 
= connectionString;
            DbCommand cmd 
= provider.CreateCommand();
            cmd.Connection 
= connection;
            cmd.CommandText 
= strSQL;
            
try
            {
                connection.Open();
                DbDataReader myReader 
= cmd.ExecuteReader(CommandBehavior.CloseConnection);
                
return myReader;
            }
            
catch (System.Data.Common.DbException e)
            {
                connection.Close();
                connection.Dispose();
                
throw new Exception(e.Message);
            }

        }
        
/// <summary>
        
/// 执行查询语句,返回DataSet
        
/// </summary>
        
/// <param name="SQLString">查询语句</param>
        
/// <returns>DataSet</returns>
        public DataSet GetDataSet(string SQLString)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                
using (DbCommand cmd = provider.CreateCommand())
                {
                    cmd.Connection 
= connection;
                    cmd.CommandText 
= SQLString;
                    
try
                    {
                        DataSet ds 
= new DataSet();
                        DbDataAdapter adapter 
= provider.CreateDataAdapter();
                        adapter.SelectCommand 
= cmd;
                        adapter.Fill(ds, 
"ds");
                        
return ds;
                    }
                    
catch (DbException ex)
                    {
                        connection.Close();
                        connection.Dispose();
                        
throw new Exception(ex.Message);
                    }
                }
            }
        }
        
#endregion

        
#region 执行带参数的SQL语句

        
/// <summary>
        
/// 执行SQL语句,返回影响的记录数
        
/// </summary>
        
/// <param name="SQLString">SQL语句</param>
        
/// <returns>影响的记录数</returns>
        public int ExecuteSql(string SQLString, DbParameter[] cmdParms)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                
using (DbCommand cmd = provider.CreateCommand())
                {
                    cmd.Connection 
= connection;
                    cmd.CommandText 
= SQLString;
                    
try
                    {
                        PrepareCommand(cmd, connection, 
null, SQLString, cmdParms);
                        
int rows = cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();
                        
return rows;
                    }
                    
catch (DbException E)
                    {
                        connection.Close();
                        connection.Dispose();
                        
throw new Exception(E.Message);
                    }
                }
            }
        }

        
/// <summary>
        
/// 执行多条SQL语句,实现数据库事务。
        
/// </summary>
        
/// <param name="SQLStringList">SQL语句的哈希表(key为sql语句,value是该语句的SqlParameter[])</param>
        public void ExecuteSqlTran(Hashtable SQLStringList)
        {
            
using (DbConnection conn = provider.CreateConnection())
            {
                conn.ConnectionString 
= connectionString;
                conn.Open();
                
using (DbTransaction trans = conn.BeginTransaction())
                {
                    
using (DbCommand cmd = provider.CreateCommand())
                    {
                        
try
                        {
                            
//循环
                            foreach (DictionaryEntry myDE in SQLStringList)
                            {
                                
string cmdText = myDE.Key.ToString();
                                DbParameter[] cmdParms 
= (DbParameter[])myDE.Value;
                                PrepareCommand(cmd, conn, trans, cmdText, cmdParms);
                                
int val = cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                        }
                        
catch (DbException ex)
                        {
                            trans.Rollback();
                            conn.Close();
                            conn.Dispose();
                            
throw ex;
                        }
                    }
                }
            }
        }

        
/// <summary>
        
/// 执行一条计算查询结果语句,返回查询结果(object),返回首行首列的值;
        
/// </summary>
        
/// <param name="SQLString">计算查询结果语句</param>
        
/// <returns>查询结果(object)</returns>
        public object GetSingle(string SQLString, DbParameter[] cmdParms)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                
using (DbCommand cmd = provider.CreateCommand())
                {
                    
try
                    {
                        PrepareCommand(cmd, connection, 
null, SQLString, cmdParms);
                        
object obj = cmd.ExecuteScalar();
                        cmd.Parameters.Clear();
                        
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                        {
                            
return null;
                        }
                        
else
                        {
                            
return obj;
                        }
                    }
                    
catch (DbException e)
                    {
                        connection.Close();
                        connection.Dispose();
                        
throw new Exception(e.Message);
                    }
                }
            }
        }

        
/// <summary>
        
/// 执行查询语句,返回SqlDataReader
        
/// </summary>
        
/// <param name="strSQL">查询语句</param>
        
/// <returns>SqlDataReader</returns>
        public DbDataReader ExecuteReader(string SQLString, DbParameter[] cmdParms)
        {
            DbConnection connection 
= provider.CreateConnection();
            connection.ConnectionString 
= connectionString;
            DbCommand cmd 
= provider.CreateCommand();
            
try
            {
                PrepareCommand(cmd, connection, 
null, SQLString, cmdParms);
                DbDataReader myReader 
= cmd.ExecuteReader(CommandBehavior.CloseConnection);
                cmd.Parameters.Clear();
                
return myReader;
            }
            
catch (DbException e)
            {
                connection.Close();
                connection.Dispose();
                
throw new Exception(e.Message);
            }

        }

        
/// <summary>
        
/// 执行查询语句,返回DataSet
        
/// </summary>
        
/// <param name="SQLString">查询语句</param>
        
/// <returns>DataSet</returns>
        public DataSet GetDataSet(string SQLString, DbParameter[] cmdParms)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                
using (DbCommand cmd = provider.CreateCommand())
                {
                    
using (DbDataAdapter da = provider.CreateDataAdapter())
                    {
                        PrepareCommand(cmd, connection, 
null, SQLString, cmdParms);
                        da.SelectCommand 
= cmd;
                        DataSet ds 
= new DataSet();
                        
try
                        {
                            da.Fill(ds, 
"ds");
                            cmd.Parameters.Clear();
                            
return ds;
                        }
                        
catch (DbException ex)
                        {
                            connection.Close();
                            connection.Dispose();
                            
throw new Exception(ex.Message);
                        }
                    }
                }
            }
        }

        
private void PrepareCommand(DbCommand cmd, DbConnection conn, DbTransaction trans, string cmdText, DbParameter[] cmdParms)
        {
            
if (conn.State != ConnectionState.Open)
            {
                conn.Open();
            }
            cmd.Connection 
= conn;
            cmd.CommandText 
= cmdText;
            
if (trans != null)
            {
                cmd.Transaction 
= trans;
            }
            cmd.CommandType 
= CommandType.Text;//cmdType;
            if (cmdParms != null)
            {
                
foreach (DbParameter parm in cmdParms)
                {
                    cmd.Parameters.Add(parm);
                }
            }
        }

        
#endregion

        
#region 存储过程操作
        
/// <summary>
        
/// 执行存储过程;
        
/// </summary>
        
/// <param name="storeProcName">存储过程名</param>
        
/// <param name="parameters">所需要的参数</param>
        
/// <returns>返回受影响的行数</returns>
        public int RunProcedureExecuteSql(string storeProcName, DbParameter[] parameters)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                DbCommand cmd 
= BuildQueryCommand(connection, storeProcName, parameters);
                
int rows = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                connection.Close();
                
return rows;
            }
        }

        
/// <summary>
        
/// 执行存储过程,返回首行首列的值
        
/// </summary>
        
/// <param name="storeProcName">存储过程名</param>
        
/// <param name="parameters">存储过程参数</param>
        
/// <returns>返回首行首列的值</returns>
        public Object RunProcedureGetSingle(string storeProcName, DbParameter[] parameters)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                
try
                {
                    DbCommand cmd 
= BuildQueryCommand(connection, storeProcName, parameters);
                    
object obj = cmd.ExecuteScalar();
                    cmd.Parameters.Clear();
                    
if ((Object.Equals(obj, null)) || (Object.Equals(obj, System.DBNull.Value)))
                    {
                        
return null;
                    }
                    
else
                    {
                        
return obj;
                    }
                }
                
catch (DbException e)
                {
                    connection.Close();
                    connection.Dispose();
                    
throw new Exception(e.Message);
                }
            }
        }

        
/// <summary>
        
/// 执行存储过程
        
/// </summary>
        
/// <param name="storedProcName">存储过程名</param>
        
/// <param name="parameters">存储过程参数</param>
        
/// <returns>SqlDataReader</returns>
        public DbDataReader RunProcedureGetDataReader(string storedProcName, DbParameter[] parameters)
        {
            DbConnection connection 
= provider.CreateConnection();
            connection.ConnectionString 
= connectionString;
            DbDataReader returnReader;
            DbCommand cmd 
= BuildQueryCommand(connection, storedProcName, parameters);
            cmd.CommandType 
= CommandType.StoredProcedure;
            returnReader 
= cmd.ExecuteReader(CommandBehavior.CloseConnection);
            cmd.Parameters.Clear();
            
return returnReader;
        }

        
/// <summary>
        
/// 执行存储过程
        
/// </summary>
        
/// <param name="storedProcName">存储过程名</param>
        
/// <param name="parameters">存储过程参数</param>
        
/// <returns>DataSet</returns>
        public DataSet RunProcedureGetDataSet(string storedProcName, DbParameter[] parameters)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                DataSet dataSet 
= new DataSet();
                DbDataAdapter sqlDA 
= provider.CreateDataAdapter();
                sqlDA.SelectCommand 
= BuildQueryCommand(connection, storedProcName, parameters);
                sqlDA.Fill(dataSet);
                sqlDA.SelectCommand.Parameters.Clear();
                sqlDA.Dispose();
                
return dataSet;
            }
        }

        
/// <summary>
        
/// 执行多个存储过程,实现数据库事务。
        
/// </summary>
        
/// <param name="SQLStringList">存储过程的哈希表(value为存储过程语句,key是该语句的DbParameter[])</param>
        public bool RunProcedureTran(Hashtable SQLStringList)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                connection.Open();
                
using (DbTransaction trans = connection.BeginTransaction())
                {
                    
using (DbCommand cmd = provider.CreateCommand())
                    {
                        
try
                        {
                            
//循环
                            foreach (DictionaryEntry myDE in SQLStringList)
                            {
                                cmd.Connection 
= connection;
                                
string storeName = myDE.Value.ToString();
                                DbParameter[] cmdParms 
= (DbParameter[])myDE.Key;

                                cmd.Transaction 
= trans;
                                cmd.CommandText 
= storeName;
                                cmd.CommandType 
= CommandType.StoredProcedure;
                                
if (cmdParms != null)
                                {
                                    
foreach (DbParameter parameter in cmdParms)
                                    {
                                        cmd.Parameters.Add(parameter);
                                    }
                                }
                                
int val = cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                            
return true;
                        }
                        
catch
                        {
                            trans.Rollback();
                            connection.Close();
                            connection.Dispose(); 
                            
return false;
                        }
                    }
                }
            }
        }

        
/// <summary>
        
/// 执行多个存储过程,实现数据库事务。
        
/// </summary>
        
/// <param name="SQLStringList">存储过程的哈希表(value为存储过程语句,key是该语句的DbParameter[])</param>
        public bool RunProcedureTran(C_HashTable SQLStringList)
        {
            
using (DbConnection connection = provider.CreateConnection())
            {
                connection.ConnectionString 
= connectionString;
                connection.Open();
                
using (DbTransaction trans = connection.BeginTransaction())
                {
                    
using (DbCommand cmd = provider.CreateCommand())
                    {
                        
try
                        {
                            
//循环
                            foreach (DbParameter[] cmdParms in SQLStringList.Keys)
                            {
                                cmd.Connection 
= connection;
                                
string storeName = SQLStringList[cmdParms].ToString();

                                cmd.Transaction 
= trans;
                                cmd.CommandText 
= storeName;
                                cmd.CommandType 
= CommandType.StoredProcedure;
                                
if (cmdParms != null)
                                {
                                    
foreach (DbParameter parameter in cmdParms)
                                    {
                                        cmd.Parameters.Add(parameter);
                                    }
                                }
                                
int val = cmd.ExecuteNonQuery();
                                cmd.Parameters.Clear();
                            }
                            trans.Commit();
                            
return true;
                        }
                        
catch
                        {
                            trans.Rollback();
                            connection.Close();
                            connection.Dispose();
                            
return false;                            
                        }
                    }
                }
            }
        }

        
/// <summary>
        
/// 构建 SqlCommand 对象(用来返回一个结果集,而不是一个整数值)
        
/// </summary>
        
/// <param name="connection">数据库连接</param>
        
/// <param name="storedProcName">存储过程名</param>
        
/// <param name="parameters">存储过程参数</param>
        
/// <returns>SqlCommand</returns>
        private DbCommand BuildQueryCommand(DbConnection connection, string storedProcName, DbParameter[] parameters)
        {
            
if (connection.State != ConnectionState.Open)
            {
                connection.Open();
            }
            DbCommand command 
= provider.CreateCommand();
            command.CommandText 
= storedProcName;
            command.Connection 
= connection;
            command.CommandType 
= CommandType.StoredProcedure;
            
if (parameters != null)
            {
                
foreach (DbParameter parameter in parameters)
                {
                    command.Parameters.Add(parameter);
                }
            }
            
return command;
        }
        
#endregion
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值