1. 程式人生 > >關於資料庫查詢語句SqlDataReader的連線釋放問題的解決辦法

關於資料庫查詢語句SqlDataReader的連線釋放問題的解決辦法

         大家在使用SqlDataReader查詢語句的時候,都會有遇到釋放連線的問題。甚至如果頻繁對資料庫使用此查詢語句時,則會“超時間時間已到。在操作完成之前超時時間已過或伺服器未響應”的問題,其實這是由於資料庫的連線數超過了連線池的最大值。由於在SqlDataReader查詢語句有返回查詢值,所以不能用using去解決這個問題。為此微軟為SqlDataReader提供了一個屬性,專門用來解決SqlDataReader的連線釋放問題。如下:

       /// <summary>
       /// 用來查詢記錄,以SqlDataReader物件形式返回
       /// </summary>
       /// <param name="sql">用來查詢的sql語句</param>
       /// <returns>返回一個SqlDataReader物件</returns>
        public SqlDataReader GetRow(string sql)
        {
           
            
            //建立資料庫連線
            SqlConnection con = CreateCon();
            //開啟資料庫連線
            con.Open();
            //建立SqlCommand物件
            SqlCommand com = new SqlCommand(sql, con);
            
            //返回ExecuteReader方法返回的DataReader物件
			//這個屬性就是用來當呼叫的地方釋放連線即可將此處的申請的連線進行釋放
            SqlDataReader sdr = com.ExecuteReader(CommandBehavior.CloseConnection);
            return sdr;
}

以上是建立連線的程式碼,在最後面加入CommandBehavior.CloseConnection這個屬性後,使其在呼叫的地方對reader進行釋放,即可關閉連線如下

        public void KQGeteareaname(string Loginname)
        {
            string sql = "select KQKH_groupName,KQKH_areaName,KQKH_logUserPass,KQKH_IfFileDown from KQKH_logTable where KQKH_logUserName='" + Loginname + "'";
            //SQLoperate 是一個數據庫的操作類
            SQLoperate sqloperate = new SQLoperate();
            //使用using在使用玩sdr後,對其進行釋放,從而關閉了資料庫的連線
             using (SqlDataReader sdr = sqloperate.GetRow(sql))
            {
                sdr.Read();
                KQgroupaname = sdr["KQKH_groupName"].ToString();
                KQareaname = sdr["KQKH_areaName"].ToString();
                IfFileDown = (bool)sdr["KQKH_IfFileDown"];
                KQpassword = sdr["KQKH_logUserPass"].ToString();
            }
         

        }

經驗證,這樣就可以關閉資料庫的連線了