c# 數據庫 連接池 存儲過程

下面的代碼來自於網絡,只是把連接池設置和存儲過程加在一起了

public class DbConn

    {
        private const int MaxPool = 30; //最大連接數 
        private const int MinPool=5;//最小連接數
        private const bool Asyn_Process=true;//設置異步訪問數據庫  
        private const bool Mars=true;//在單個連接上得到和管理多個、僅向前引用和只讀的結果集(ADO.NET2.0)  
        private const int Conn_Timeout=15;//設置連接等待時間
        private const int Conn_Lifetime=15;//設置連接的生命週期  
        private string ConnString="";//連接字符串 
        private SqlConnection SqlDrConn=null;//連接對象 
 
        public void SetConnString(string server,string dbName,string user,string pwd)  
        {
            ConnString = "Server=" + server + ";"
                + "Database=" + dbName + ";"
                + "User ID=" + user + ";"
                + "Password=" + pwd + ";"
                + "Max Pool Size=" + MaxPool + ";"
                + "Min Pool Size=" + MinPool + ";"
                + "Connect Timeout=" + Conn_Timeout + ";"
                + "Connection Lifetime=" + Conn_Lifetime + ";"
                + "Async=" + Asyn_Process + ";"
                + "Integrated Security=sspi"; //當爲 false 時,將在連接中指定用戶 ID 和密碼。當爲 true 時,將使用當前的 Windows 帳戶憑據進行身份驗證(用戶名和密碼無效)。
                                              // 可識別的值爲 true、false、yes、no 以及與 true 等效的 sspi(強烈推薦)。






            SqlDrConn = new SqlConnection(ConnString);
        }  


        public DataTable GetDataReader(string StrSql)//數據查詢  
        {  
            //當連接處於打開狀態時關閉,然後再打開,避免有時候數據不能及時更新  
            if(SqlDrConn.State==ConnectionState.Open)  
            {  
                SqlDrConn.Close();  
            }  
            try 
            {  
                SqlDrConn.Open();  
                SqlCommand SqlCmd=new SqlCommand(StrSql,SqlDrConn);
                SqlDataReader SqlDr=SqlCmd.ExecuteReader();  
                if(SqlDr.HasRows)  
                {  
                    DataTable dt=new DataTable();  
                    //讀取SqlDataReader裏的內容  
                    dt.Load(SqlDr);  
                    //關閉對象和連接  
                    SqlDr.Close();  
                    SqlDrConn.Close();  
                    return dt;  
                }  
                return null;  
            }  
            catch(Exception ex)  
            {  
                System.Windows.Forms.MessageBox.Show(ex.Message);  


                return null;  
            }  
            finally 
            {  
                SqlDrConn.Close(); 
            }  
        }
  
        #region 執行不帶參數的存儲過程,返回存儲過程返回值 
        /// <summary> 
        /// 執行存儲過程 
        /// </summary> 
        /// <param name="procName">不帶參數的存儲過程的名稱</param> 
        /// <returns>返回存儲過程返回值</returns> 
        public int RunProc(string procName)
        {
            SqlCommand cmd = CreateCommand(procName, null);
            cmd.ExecuteNonQuery();
            this.Close();
            return (int)cmd.Parameters["ReturnValue"].Value;
        }
        #endregion


        #region 執行帶參數的存儲過程,返回存儲過程返回值
        /// <summary> 
        /// 執行存儲過程 ,已經帶有關閉操作
        /// </summary> 
        /// <param name="procName">帶參數存儲過程名稱</param> 
        /// <param name="prams">存儲過程所需參數</param> 
        /// <returns>返回存儲過程返回值</returns> 
        public int RunProc(string procName, SqlParameter[] prams)
        {
            SqlCommand cmd = CreateCommand(procName, prams);
            cmd.ExecuteNonQuery();
            this.Close();
            return (int)cmd.Parameters["ReturnValue"].Value;
        }
        #endregion


        #region 執行不帶參數的存儲過程,通過輸出參數返回SqlDataReader對象
        /// <summary> 
        /// 執行存儲過程 ,不帶有關閉操作,使用完後,請注意關閉連接,避免資源浪費
        /// </summary> 
        /// <param name="procName">不帶參數的存儲過程的名稱</param> 
        /// <param name="dataReader">通過輸出參數返回SqlDataReader對象</param> 
        public void RunProc(string procName, out SqlDataReader dataReader)
        {
            SqlCommand cmd = CreateCommand(procName, null);
            dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        }
        #endregion


        #region 執行帶參數的存儲過程,通過輸出參數返回SqlDataReader對象
        /// <summary> 
        /// 執行存儲過程 ,不帶有關閉操作,使用完後,請注意關閉連接,避免資源浪費
        /// </summary> 
        /// <param name="procName">帶參數的存儲過程的名稱</param> 
        /// <param name="prams">存儲過程所需參數</param> 
        /// <param name="dataReader">通過輸出參數返回SqlDataReader對象</param> 
        public void RunProc(string procName, SqlParameter[] prams, out SqlDataReader dataReader)
        {
            SqlCommand cmd = CreateCommand(procName, prams);
            dataReader = cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        }
        #endregion


        #region 創建SqlCommand對象
        /// <summary> 
        /// 創建一個SqlCommand對象以此來執行存儲過程 ,不帶有關閉操作,使用完後,請注意關閉連接,避免資源浪費
        /// </summary> 
        /// <param name="procName">存儲過程的名稱</param> 
        /// <param name="prams">存儲過程所需參數</param> 
        /// <returns>返回SqlCommand對象</returns> 
        private SqlCommand CreateCommand(string procName, SqlParameter[] prams)
        {
            // 確認打開連接 
            Open();
            SqlCommand cmd = new SqlCommand(procName, SqlDrConn);
            cmd.CommandType = CommandType.StoredProcedure;


            // 依次把參數傳入存儲過程 
            if (prams != null)
            {
                foreach (SqlParameter parameter in prams)
                    cmd.Parameters.Add(parameter);
            }


            // 加入返回參數 
            cmd.Parameters.Add(
            new SqlParameter("ReturnValue", SqlDbType.Int, 4,
            ParameterDirection.ReturnValue, false, 0, 0,
            string.Empty, DataRowVersion.Default, null));


            return cmd;
        }
        #endregion


        #region 打開數據庫連接
        /// <summary> 
        /// 打開數據庫連接. 
        /// </summary> 
        private void Open()
        {
            // 打開數據庫連接 
            if (SqlDrConn == null)
            {
                SqlDrConn = new SqlConnection(ConnString);  
            }
            else
            {
                //當連接處於打開狀態時關閉,然後再打開,避免有時候數據不能及時更新  
                if (SqlDrConn.State == ConnectionState.Open)
                {
                    SqlDrConn.Close();
                }  
            }


            SqlDrConn.Open();


        }
        #endregion


        #region 關閉數據庫連接
        /// <summary> 
        /// 關閉數據庫連接 
        /// </summary> 
        public void Close()
        {
            if (SqlDrConn != null)
                SqlDrConn.Close();
        }
        #endregion


        #region 釋放資源
        /// <summary> 
        /// 釋放資源 
        /// </summary> 
        public void Dispose()
        {
            // 確認連接是否已經關閉 
            if (SqlDrConn != null)
            {
                SqlDrConn.Dispose();
                SqlDrConn = null;
            }
        }
        #endregion


        #region 傳入輸入參數
        /// <summary> 
        /// 傳入輸入參數 
        /// </summary> 
        /// <param name="ParamName">存儲過程參數名稱</param> 
        /// <param name="DbType">參數類型</param> 
        /// <param name="Size">參數大小</param> 
        /// <param name="Value">參數值</param> 
        /// <returns>新的 parameter 對象</returns> 
        public SqlParameter MakeInParam(string ParamName, SqlDbType DbType, int Size, object Value)
        {
            return MakeParam(ParamName, DbType, Size, ParameterDirection.Input, Value);
        }
        #endregion


        #region 傳入輸出參數
        /// <summary> 
        /// 傳入輸出參數 
        /// </summary> 
        /// <param name="ParamName">存儲過程參數名稱</param> 
        /// <param name="DbType">參數類型</param> 
        /// <param name="Size">參數大小</param> 
        /// <returns>新的 parameter 對象</returns> 
        public SqlParameter MakeOutParam(string ParamName, SqlDbType DbType, int Size)
        {
            return MakeParam(ParamName, DbType, Size, ParameterDirection.Output, null);
        }
        #endregion


        #region 傳入返回值參數
        /// <summary> 
        /// 傳入返回值參數 
        /// </summary> 
        /// <param name="ParamName">存儲過程參數名稱</param> 
        /// <param name="DbType">參數類型</param> 
        /// <param name="Size">參數大小</param> 
        /// <returns>新的 parameter 對象</returns> 
        public SqlParameter MakeReturnParam(string ParamName, SqlDbType DbType, int Size)
        {
            return MakeParam(ParamName, DbType, Size, ParameterDirection.ReturnValue, null);
        }
        #endregion


        #region 生成存儲過程參數
        /// <summary> 
        /// 生成存儲過程參數 
        /// </summary> 
        /// <param name="ParamName">存儲過程參數名稱</param> 
        /// <param name="DbType">參數類型</param> 
        /// <param name="Size">參數大小</param> 
        /// <param name="Direction">參數方向</param> 
        /// <param name="Value">參數值</param> 
        /// <returns>新的 parameter 對象</returns> 
        public SqlParameter MakeParam(string ParamName, SqlDbType DbType, Int32 Size, ParameterDirection Direction, object Value)
        {
            SqlParameter param;


            if (Size > 0)
                param = new SqlParameter(ParamName, DbType, Size);
            else
                param = new SqlParameter(ParamName, DbType);


            param.Direction = Direction;
            if (!(Direction == ParameterDirection.Output && Value == null))
                param.Value = Value;


            return param;
        }
        #endregion


        #region 將DataReader 轉爲 DataTable
        /// <summary> 
        /// 將DataReader 轉爲 DataTable 
        /// </summary> 
        /// <param name="DataReader">DataReader</param> 
        public static DataTable ConvertDataReaderToDataTable(SqlDataReader reader)
        {
            try
            {


                DataTable objDataTable = new DataTable();
                int intFieldCount = reader.FieldCount;
                for (int intCounter = 0; intCounter < intFieldCount; ++intCounter)
                {
                    objDataTable.Columns.Add(reader.GetName(intCounter), reader.GetFieldType(intCounter));
                }


                objDataTable.BeginLoadData();


                object[] objValues = new object[intFieldCount];
                while (reader.Read())
                {
                    reader.GetValues(objValues);
                    objDataTable.LoadDataRow(objValues, true);
                }
                reader.Close();
                objDataTable.EndLoadData();


                return objDataTable;


            }
            catch (Exception ex)
            {
                throw new Exception("轉換DataReader爲DataTable出錯!", ex);
            }


        }
        #endregion


        #region 數字判定
        /// <summary> 
        /// 數字判定 
        /// </summary> 
        /// <param name="str">字符串參數</param> 
        public static bool IsNumber(String strNumber)
        {
            Regex objNotNumberPattern = new Regex("[^0-9.-]");
            Regex objTwoDotPattern = new Regex("[0-9]*[.][0-9]*[.][0-9]*");
            Regex objTwoMinusPattern = new Regex("[0-9]*[-][0-9]*[-][0-9]*");
            String strValidRealPattern = "^([-]|[.]|[-.]|[0-9])[0-9]*[.]*[0-9]+$";
            String strValidIntegerPattern = "^([-]|[0-9])[0-9]*$";
            Regex objNumberPattern = new Regex("(" + strValidRealPattern + ")|(" + strValidIntegerPattern + ")");


            return !objNotNumberPattern.IsMatch(strNumber) &&
            !objTwoDotPattern.IsMatch(strNumber) &&
            !objTwoMinusPattern.IsMatch(strNumber) &&
            objNumberPattern.IsMatch(strNumber);
        }
        #endregion


    }  



用SqlDataReader獲取DataTable

public DataTable Convertdrtodt(SqlDataReader dr)
    {
        DataTable dataTable = new DataTable();//建一個新的實例

        
        for(int i=0; i<dr.FieldCount;i++)
        {
            DataColumn mydc = new DataColumn();//關鍵的一步
            mydc.DataType = dr.GetFieldType(i);
            mydc.ColumnName = dr.GetName(i);

            dataTable.Columns.Add(mydc);//關鍵的第二步
        }

        while (dr.Read())
        {
            DataRow mydr = dataTable.NewRow();//關鍵的第三步
            for (int i = 0; i < dr.FieldCount; i++)
            {
                mydr[i] = dr[i].ToString();
            }

            dataTable.Rows.Add(mydr);//關鍵的第四步
            mydr = null;
        }

        dr.Close();
        return (dataTable);//別忘了要返回datatable,否則出錯

    }
發佈了59 篇原創文章 · 獲贊 16 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章