2012-01-24 81 views
4

1)我有以下代碼時:「無效試圖調用讀取時讀取器被關閉的」 使用一個SqlDataReader

private static sqlDataReader gCandidateList = null; 

public SqlDataReader myCandidateList 
{ 
    set 
    { 
     gCandidateList = value; 
    } 
    get 
    { 
     return gCandidateList; 
    } 
} 

2)在FORMA我有:

sqlConn.ConnectionString = mySettings.myConnString; 
sqlConn.Open(); 
SqlCommand cmdAvailableCandidate = new SqlCommand(tempString, sqlConn); 
SqlDataReader drAvailableCandidate = cmdAvailableCandidate.ExecuteReader(); 
mySettings.myCandidateList = drAvailableCandidate; 
sqlConn.Close(); 

3)在FormB我想重用保存在myCandidatList數據,所以我使用:

SqlDataReader drCandidate = mySettings.myCandidateList; 
drCandidate.Read(); 

4)然後我得到了錯誤「Invalide試圖調用閱讀時讀者關閉了。」

5)我嘗試了上面(3)中的mySettings.myCandidateList.Read(),並再次收到相同的錯誤消息。

6)我怎樣才能重新打開SqlDataReader drCandidate讀取數據?

7)請非常感謝您的建議和幫助。

+3

靜態DataReader從來就不是一個好主意。 – SLaks

回答

6

連接爲closeddisposed時,您無法讀取讀取器。如果您想在代碼中稍後使用這些行(獲取結果),則需要創建ListDataTable

例如,

System.Data.DataTable dt = new System.Data.DataTable(); 
dt.Load(drAvailableCandidate); 
0

你關閉連接您嘗試從讀者閱讀之前。這是行不通的。

0

當您在SqlConnection對象(sqlConn.Close();)上調用關閉時,它會關閉連接和數據讀取器。這就是爲什麼當您嘗試從FormB的SqlDataReader讀取時出現錯誤。

您需要做的是將您的myCandidateList屬性的定義更改爲返回從您的drAvailableCandidate閱讀器中提取的數據的表示。

基本上,你需要做的是遍歷drAvailableCandidate對象中的行,提取這些值並將它們緩存在屬性中供以後檢索。

1

如果您想在稍後階段使用數據讀取器,則必須將相同的參數指定爲ExecuteReader方法。 FormA中的代碼應該如下更改。

sqlConn.ConnectionString = mySettings.myConnString; 
sqlConn.Open(); 
SqlCommand cmdAvailableCandidate = new SqlCommand(tempString, sqlConn); 
SqlDataReader drAvailableCandidate = cmdAvailableCandidate.ExecuteReader(CommandBehavior.CloseConnection); 
mySettings.myCandidateList = drAvailableCandidate; 
sqlConn.Close(); 

確保處置的DataReader一旦被使用,直到DataReader關閉到數據庫的連接將保持打開。如下所示更好地更改FormB中的代碼。

using (mySettings.myCandidateList) 
{ 
mySettings.myCandidateList.Read(); 
} 
0

只需添加到已經給出的答案,如果你使用異步/等待那麼很容易獲得通過不等待一個SqlConnection的使用塊內的操作與此抓了出來。例如,執行以下操作可以給報告的錯誤

public Task GetData() 
{ 
    using(new SqlConnection(connString)) 
    { 
     return SomeAsyncOperation(); 
    } 
} 

這裏的問題是我們沒有等待使用內部的操作,因此它被處置之前,我們實際執行的下屬異步操作。相當明顯,但之前讓我出去了。

做正在使用內部等待的正確的事情。

public async Task GetData() 
{ 
    using(new SqlConnection(connString)) 
    { 
     await SomeAsyncOperation(); 
    } 
} 
相關問題