SqlDataReader類型的變量,會自動Close.

SqlDataReader類型的變量,會自動Close.
比如用下面函數傳遞SqlDataReader類型的變量,接收時,會得到空值,原因是SqlDataReader會自動關閉,即Close()
SqlDataReader dataReader = ExecuteReader(sqlstring)

函數
public static SqlDataReader ExecuteReader(string strSQL)
{
   
using(SqlConnection connection = new SqlConnection(connectionString))
   {
            SqlCommand cmd 
= new SqlCommand(strSQL,connection);    
            
try
            {
                    connection.Open(); 
                    SqlDataReader myReader 
= cmd.ExecuteReader();
                    
return myReader;     
           }
           
catch(System.Data.SqlClient.SqlException e)
           {  
                  connection.Close();
                  connection.Dispose();
                  
throw new Exception(e.Message);
           }
    }   
}  

如果做爲參數和返回值傳遞是比較危險的,因爲你要傳出去就Close(),而究竟在哪裏關閉容易被遺忘和忽略
所以我覺得還是用強類型的DataSet做爲參數和返回值傳遞紀錄集比較好。


使用SqlDataReader注意的幾點:

1、當SqlDataReader沒有關閉之前,數據庫連接會一直保持open狀態,所以在使用SqlDataReader時,使用完畢應該馬上調用SqlDataReader.Close()關閉它。

2、一個連接只能被一個SqlDataReader使用,這也是爲什麼要儘早關閉SqlDataReader的原因。

3、使用完SqlDataReader後,你可以在程序中顯示的調用數據庫連接對象的Close方法關閉連接,也可以在調用Command對象的ExecuteReader方法時傳遞CommandBehavior.CloseConnection 這個枚舉變量,這樣在調用SqlDataReader的Close方法時會自動關閉數據庫連接。

4、使用SqlDataReader時儘量使用和數據庫字段類型匹配的方法來取得相應的值,比如對於整形的字段使用GetInt32,對字符類型的字段使用GetString。這樣會減少因爲類型不一致而額外增加的類型轉換操作。

5、使用SqlDataReader獲取多條記錄時,如果沒有訪問到取出記錄的末尾時想要關閉SqlDataReader,應該先調用Command對象的Cancel方法,然後再調用SqlDataReader的Close方法。Command對象的Cancel方法使得數據庫不再把SqlDataReader中未訪問的數據發送到調用端,如果不調用此方法直接關閉SqlDataReader,數據庫會發送和SqlDataReader未訪問數據等長的空數據流到調用端。

6、如果想通過SqlCommand的ExecuteReader方法獲取存儲過程的返回值或者輸出參數,必須先調用SqlDataReader的Close方法後,才能獲取輸出參數的值或者返回值。

7、如果使用SqlDataReader只返回一條記錄,那麼在調用Command的ExecuteReader方法時,指定
CommandBehavior.SingleRow參數,這個參數的是否使用對SQL Server .NET Data Provider沒有什麼影響,但是當你使用OLE DB .NET Data Provider時,指定這個參數後,DataPrivider內部將使用IRow接口,而不是使用相對來說耗費資源的IRowSet接口。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章