c# sql server数据库连接类

//为了避免数据库连接关闭不及时的问题,需要保持连接的查询需要自己控制连接的关闭。

//用.net一定要注意关闭用完的连接和资源,因为.net的垃圾回收不理想,而.net程序不能占用超过1g的内存

using System;

using System.Data;

using System.Threading;

using System.Collections;

using System.Runtime.Remoting.Lifetime;

using System.Data.SqlClient;

 

namespace WebIndex

{

 

     /// <summary>

     /// DataAccess 的摘要说明。

     /// <description>数据处理基类,调用方式:DataAccess.DataSet((string)sqlstr);或者DataAccess.DataSet((string)sqlstr,ref DataSet ds); </description>

     /// </summary>

     public class SqlConn

     {

         #region  属性

 

         public struct OConntion

         {

              public SqlConnection conn;

              public bool connLock;

              public DateTime outTime;

              public string sqlStr;

              public string error;

         }

         public struct SqlError

         {

              public string sqlStr;

              public string errInfo;

              public DateTime errTime;

         }

 

         public static SqlError[] sqlError;

         public static OConntion[] sconn;

         public static Queue opened = new Queue();

         public static Queue closed = new Queue();

         public static int nConn=100;

         public static int mastConn=0;

         public static int exConn=0;

         public static int errorConn=0;

         public static int otherError=0;

         public static int OKConn=0;

         protected static bool format=true;

 

         #endregion

 

         public SqlConn()

         {

         }

 

         #region 内部函数 数据库连接池

         private static int getOpened()

         {

              int ret = -1;

              int peek = 0;

              for(int i=0;i<opened.Count;i++)

              {

                   if(opened.Count == 0) return -1;

                   peek = (int)opened.Peek();

                   if(sconn[peek].conn.State == ConnectionState.Closed)

                   {

                       //关闭的连接回到关闭队列

                       sconn[peek].conn.Dispose();

                       sconn[peek].connLock = false;

                       closed.Enqueue(opened.Dequeue());

                       continue;

                   }

                   if(sconn[peek].connLock == false)

                   {

                       //未被锁闭的连接

                       opened.Enqueue(opened.Dequeue());

                       ret = peek;

                       break;

                   }

                   else

                   {

                       opened.Enqueue(opened.Dequeue());

                   }

              }

              return ret;

         }

 

         private static int getClosed()

         {

              int ret = -1;

              if(closed.Count>0)

              {

                   ret = (int)closed.Dequeue();

                   opened.Enqueue(ret);

              }

              return ret;

         }

 

         private static int getConn()

         {

              int ret = -1;

              lock(typeof(SqlConn))

              {

                   if(format)

                   {

                       //格式化数据

                       sconn = new OConntion[nConn];

                       sqlError = new SqlError[nConn];

                       for(int f=0;f<nConn;f++)

                       {

                            sconn[f].conn = new SqlConnection();

                            sconn[f].connLock = false;

                            sconn[f].sqlStr = "";

                            sconn[f].error = "";

                            //sclosed.Push(nConn-f-1);

                            closed.Enqueue(f);

                       }

                       format = false;

                   }

                   ret = getOpened();

                   if(ret < 0) ret = getClosed();

                   if(ret < 0)

                   {

                        //没有找到可用连接,强行分配一个!

                       mastConn++;

                       ret = (int)opened.Dequeue();

                       opened.Enqueue(ret);

                   }

                   sconn[ret].connLock = true;

              }

              OKConn++;

              exConn = ret;

              if(sconn[ret].conn.State != ConnectionState.Closed)

                   sconn[ret].conn.Close();

              sconn[ret].conn.Dispose();

              return ret;

         }

 

         private static void freeConn(int freeConn)

         {

              if(sconn[freeConn].conn.State == ConnectionState.Open)

                   sconn[freeConn].conn.Close();

              sconn[freeConn].conn.Dispose();

              sconn[freeConn].connLock=false;

         }

 

         public static int newConn()

         {

              return getConn();

         }

 

         public static void closeConn( int i)

         {

              freeConn(i);

         }

 

         public static void logError(Exception e,string sql)

         {

              if(otherError>99) otherError = 0;

              sqlError[otherError].sqlStr = sql;

              sqlError[otherError].errInfo = e.ToString();

              sqlError[otherError].errTime = System.DateTime.Now;

              otherError++;

         }

         #endregion

 

         #region 内部函数  静态方法中不会执行 Ooconn()构造函数

 

         /// <summary>

         /// 打开数据库连接

         /// </summary>

         private static void openoconnection(int iConn)

         {

              if(sconn[iConn].conn.State != ConnectionState.Open)

              {

                   //判断是否为培训服务器

                   if(sconn[iConn].conn.State != ConnectionState.Closed)sconn[iConn].conn.Close();

                   sconn[iConn].conn.ConnectionString =  System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"];

                   try

                   {

                       sconn[iConn].conn.Open();

                   }

                   catch(Exception e)

                   {

                       errorConn++;

                       sconn[iConn].error = e.ToString();

                       throw new Exception(e.Message);

                   }

              }

         }

 

         /// <summary>

         /// 打开数据库连接

         /// </summary>

         private static void openoconnection(SqlConnection Conn)

         {

              OKConn++;

              if( Conn.State != ConnectionState.Open)

              {

                   //判断是否为培训服务器

                   if(Conn.State != ConnectionState.Closed)Conn.Close();

                   Conn.ConnectionString =  System.Configuration.ConfigurationSettings.AppSettings["SqlConnectionString"];

                   try

                   {

                       Conn.Open();

                   }

                   catch(Exception e)

                   {

                       errorConn++;

                       throw new Exception(e.Message);

                   }

              }

         }

         /// <summary>

         /// 关闭当前数据库连接

         /// </summary>

         private static void closeoconnection()

         {

         }

         #endregion

 

         /// <summary>

         /// 执行Sql查询语句

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         public static void ExecuteSql(string sqlstr)

         {

              int i=0;

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = sqlstr;

                   openoconnection(i);

                   ocomm.CommandType =CommandType.Text ;

                   ocomm.CommandText =sqlstr;

                   ocomm.ExecuteNonQuery();

                   ocomm.Dispose();

                  

              }

              catch(Exception e)

              {

                   errorConn++;

                   logError(e,sqlstr);

                   sconn[i].error = e.ToString();

                   throw new Exception(e.Message);

              }

              finally

              {

                   freeConn(i);

              }

         }

 

         /// <summary>

         /// 执行存储过程

         /// </summary>

         /// <param name="procName">存储过程名</param>

         /// <param name="coll">SqlParameters 集合</param>

         public static void ExecutePorcedure(string procName,SqlParameter[] coll)

         {

              int i=0;

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = procName;

                   openoconnection(i);

                   for(int j=0;j<coll.Length;j++)

                   {

                       ocomm.Parameters .Add(coll[j]);

                   }

                   ocomm.CommandType=CommandType.StoredProcedure ;

                   ocomm.CommandText =procName;

                   ocomm.ExecuteNonQuery();

                   ocomm.Parameters.Clear();

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   errorConn++;

                   logError(e,procName);

                   sconn[i].error = e.ToString();

                   throw new Exception(e.Message);

              }

              finally

              {

                   freeConn(i);

              }

         }

 

 

         /// <summary>

         /// 执行Sql查询语句并返回SqlDataAdapter

         /// </summary>

         /// <param name="numConn">连接号</param>

         /// <param name="sqlStr">传入的Sql语句</param>

         public static SqlDataAdapter dataAdapter(SqlConnection Conn,String sqlStr)

         {

              SqlDataAdapter ret=null;

              try

              {

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = Conn;

                   openoconnection(Conn);

                   ret = new SqlDataAdapter(sqlStr,Conn);

                   ocomm.Dispose();

 

              }

              catch( Exception e )

              {

                   logError(e,sqlStr);

                   Conn.Close();

                   Conn.Dispose();

                   throw new Exception(e.Message);

              }

              finally

              {

              }

              return ret;

         }

 

         /// <summary>

         /// 执行Sql查询语句并返回SqlDataAdapter

         /// </summary>

         /// <param name="numConn">连接号</param>

         /// <param name="sqlStr">传入的Sql语句</param>

         public static SqlDataAdapter dataAdapter(int numConn,String sqlStr)

         {

              SqlDataAdapter ret=null;

              int i=0;

              try

              {

                   i = numConn;

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = sqlStr;

                   openoconnection(i);

                   ret = new SqlDataAdapter(sqlStr,sconn[i].conn);

                   ocomm.Dispose();

 

              }

              catch( Exception e )

              {

                   errorConn++;

                   logError(e,sqlStr);

                   sconn[i].error = e.ToString();

                   freeConn(i);

                   throw new Exception(e.Message);

              }

              finally

              {

              }

              return ret;

         }

 

         /// <summary>

         /// 执行Sql查询语句并返回第一行的第一条记录,返回值为object 使用时需要拆箱操作 -> Unbox

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         /// <returns>object 返回值 </returns>

         public static object ExecuteScalar(string sqlstr)

         {

              object obj=new object();

              int i=0;

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = sqlstr;

                   openoconnection(i);

                   ocomm.CommandType =CommandType.Text ;

                   ocomm.CommandText =sqlstr;

                   obj=ocomm.ExecuteScalar();

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   errorConn++;

                   logError(e,sqlstr);

                   sconn[i].error = e.ToString();

                   throw new Exception(e.Message);

              }

              finally

              {

                   freeConn(i);

              }

              return obj;

         }

 

         /// <summary>

         /// 执行Sql查询语句,同时进行事务处理

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         public static void ExecuteSqlWithTransaction(string sqlstr)

         {

              SqlTransaction trans ;

              int i=0;

              i = getConn();

              SqlCommand   ocomm = new SqlCommand();

              ocomm.Connection = sconn[i].conn;

              sconn[i].sqlStr = sqlstr;

              openoconnection(i);

              trans=sconn[i].conn.BeginTransaction();

              ocomm.Transaction =trans;

              try

              {

                   ocomm.CommandType =CommandType.Text ;

                   ocomm.CommandText =sqlstr;

                   ocomm.ExecuteNonQuery();

                   trans.Commit();

              }

              catch(Exception e)

              {

                   errorConn++;

                   logError(e,sqlstr);

                   sconn[i].error = e.ToString();

                   trans.Rollback();

                   throw new Exception(e.Message);

              }

              finally

              {

                   ocomm.Dispose();

                   freeConn(i);

              }

         }

 

         /// <summary>

         /// 返回指定Sql语句的SqlDataReader,请注意,在使用后请关闭本对象,同时将自动调用closeoconnection()来关闭数据库连接

         /// 方法关闭数据库连接

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         /// <returns>SqlDataReader对象</returns>

         public static SqlDataReader dataReader(SqlConnection Conn,string sqlstr)

         {

              SqlDataReader dr=null;

              try

              {

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = Conn;

                   openoconnection(Conn);

                   ocomm.CommandText =sqlstr;

                   ocomm.CommandType =CommandType.Text ;

                   dr=ocomm.ExecuteReader(CommandBehavior.CloseConnection);

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   logError(e,sqlstr);

                   try

                   {

                       if(dr!=null && !dr.IsClosed)

                            dr.Close();

                       if(Conn.State != ConnectionState.Closed)

                            Conn.Close();

                       Conn.Dispose();

                   }

                   catch

                   {

                   }

              }

              finally

              {

              }

              return dr;

         }

 

         /// <summary>

         /// 返回指定Sql语句的SqlDataReader,请注意,在使用后请关闭本对象,同时将自动调用closeoconnection()来关闭数据库连接

         /// 方法关闭数据库连接

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         /// <param name="dr">传入的ref DataReader 对象</param>

         public static void dataReader(SqlConnection Conn,string sqlstr,ref SqlDataReader dr)

         {

              try

              {

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = Conn;

                   openoconnection(Conn);

                   ocomm.CommandText =sqlstr;

                   ocomm.CommandType =CommandType.Text ;

                   dr=ocomm.ExecuteReader(CommandBehavior.CloseConnection);

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   logError(e,sqlstr);

                   errorConn++;

                   try

                   {

                       if(dr!=null && !dr.IsClosed)

                            dr.Close();

                       if(Conn.State != ConnectionState.Closed)

                            Conn.Close();

                       Conn.Dispose();

                   }

                   catch

                   {

                   }

              }

              finally

              {

              }

         }

 

 

         /// <summary>

         /// 返回指定Sql语句的DataSet

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         /// <returns>DataSet</returns>

         public static DataSet dataSet(string sqlstr)

         {

              DataSet ds= new DataSet();

              SqlDataAdapter da=new SqlDataAdapter();

              int i=0;

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = sqlstr;

                   openoconnection(i);

                   ocomm.CommandType =CommandType.Text ;

                   ocomm.CommandText =sqlstr;

                   da.SelectCommand =ocomm;

                   da.Fill(ds);

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   logError(e,sqlstr);

                   errorConn++;

                   sconn[i].error = e.ToString();

                   throw new Exception(e.Message);

              }

              finally

              {

                   freeConn(i);

              }

              return ds;

         }

 

         /// <summary>

         /// 返回指定Sql语句的DataSet

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         /// <param name="ds">传入的引用DataSet对象</param>

         public static void dataSet(string sqlstr,ref DataSet ds)

         {

              SqlDataAdapter da=new SqlDataAdapter();

              int i=0;

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = sqlstr;

                   openoconnection(i);

                   ocomm.CommandType =CommandType.Text ;

                   ocomm.CommandText =sqlstr;

                   da.SelectCommand =ocomm;

                   da.Fill(ds);

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   logError(e,sqlstr);

                   errorConn++;

                   sconn[i].error = e.ToString();

                   throw new Exception(e.Message);

              }

              finally

              {

                   freeConn(i);

              }

         }

 

         /// <summary>

         /// 返回指定Sql语句的DataTable

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         /// <returns>DataTable</returns>

         public static DataTable dataTable(string sqlstr)

         {

              SqlDataAdapter da=new SqlDataAdapter();

              DataTable datatable=new DataTable();

              int i=0;

              SqlConnection Conn = new SqlConnection();

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = Conn;

                   openoconnection(Conn);

                   ocomm.CommandType =CommandType.Text ;

                   ocomm.CommandText =sqlstr;

                   da.SelectCommand =ocomm;

                   da.Fill(datatable);

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   logError(e,sqlstr);

                   throw new Exception(e.Message);

              }

              finally

              {

                   Conn.Close();

                   Conn.Dispose();

              }

              return datatable;

         }

 

         /// <summary>

         /// 执行指定Sql语句,同时给传入DataTable进行赋值

         /// </summary>

         /// <param name="sqlstr">传入的Sql语句</param>

         /// <param name="dt">ref DataTable dt </param>

         public static void dataTable(string sqlstr,ref DataTable dt)

         {

              SqlDataAdapter da=new SqlDataAdapter();

              int i=0;

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = sqlstr;

                   openoconnection(i);

                   ocomm.CommandType =CommandType.Text ;

                   ocomm.CommandText =sqlstr;

                   da.SelectCommand =ocomm;

                   da.Fill(dt);

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   logError(e,sqlstr);

                   errorConn++;

                   sconn[i].error = e.ToString();

                   throw new Exception(e.Message);

              }

              finally

              {

                   freeConn(i);

              }

         }

 

         /// <summary>

         /// 执行带参数存储过程并返回数据集合

         /// </summary>

         /// <param name="procName">存储过程名称</param>

         /// <param name="parameters">SqlParameterCollection 输入参数</param>

         /// <returns></returns>

         public static DataTable dataTable(string procName,SqlParameterCollection parameters)

         {

              SqlDataAdapter da=new SqlDataAdapter();

              DataTable datatable=new DataTable();

              int i=0;

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = procName;

                   openoconnection(i);

                   ocomm.Parameters.Clear();

                   ocomm.CommandType=CommandType.StoredProcedure ;

                   ocomm.CommandText =procName;

                   foreach(SqlParameter para in parameters)

                   {

                       SqlParameter p=(SqlParameter)para;

                       ocomm.Parameters.Add(p);

                   }

                   da.SelectCommand =ocomm;

                   da.Fill(datatable);

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   logError(e,procName);

                   errorConn++;

                   sconn[i].error = e.ToString();

                   throw new Exception(e.Message);

              }

              finally

              {

                   freeConn(i);

              }

              return datatable;

         }

        

 

         public static DataView dataView(string sqlstr)

         {

              SqlDataAdapter da=new SqlDataAdapter();

              DataView dv=new DataView();

              DataSet ds=new DataSet();

              int i=0;

              try

              {

                   i = getConn();

                   SqlCommand   ocomm = new SqlCommand();

                   ocomm.Connection = sconn[i].conn;

                   sconn[i].sqlStr = sqlstr;

                   openoconnection(i);

                   ocomm.CommandType=CommandType.Text;

                   ocomm.CommandText =sqlstr;

                   da.SelectCommand =ocomm;

                   da.Fill(ds);

                   dv=ds.Tables[0].DefaultView;

                   ocomm.Dispose();

              }

              catch(Exception e)

              {

                   errorConn++;

                   logError(e,sqlstr);

                   sconn[i].error = e.ToString();

                   throw new Exception(e.Message);

              }

              finally

              {

                   freeConn(i);

              }

              return dv;

         }

 

     }

 

 

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值