2012-02-02 34 views
1

我嘗試從數據庫中查詢數據,有時我在日誌中出現此錯誤:我得到這個SQL傳輸級錯誤,但不是所有的時間

A transport-level error has occurred when receiving results from the server. (provider: TCP Provider, error: 0 - The handle is invalid.) The code is inside a try-catch block. What is weird is that i do not get this error all the time. The catch block does get executed.

然而,不管我得到的錯誤或不,下拉列表我試圖填充不填充。好像沒有數據從查詢中返回。

我正在連接數據庫,數據在那裏,我可以打開連接並運行查詢到數據庫。數據庫與運行代碼的位置在同一臺機器上。

另外,代碼工作時,我連接到服務器上的數據庫,但我試圖使本地數據庫工作時,我沒有連接到服務器。當我想從本地數據庫運行時,我只需要更改連接字符串。

下面是查詢數據庫

public static void QueryDB(string query) 
    { 
     cmd = new SqlCommand(); 
     cmd.CommandText = query; 
     cmd.Connection = MyConn; 
     if (dr != null) dr.Dispose(); 
     dr = cmd.ExecuteReader(); 
    } 

這裏是連接字符串連接到數據庫的功能:

MyConn = new SqlConnection("Data Source=tcp:localhost; Database=EscalationManagementSystem; Integrated Security=true;"); 

是否有錯設置或可這是一個錯誤在代碼中。

在此先感謝。

+0

既然您沒有給我們任何代碼來審查有關造成這個問題的假設是不可靠的。 – 2012-02-02 18:14:30

+1

我猜'dr'是'SqlDataReader'的一些痛處?這是一個全球變量? – 2012-02-02 18:24:07

+0

對不起,是'dr'是'SqlDataReader'。 – DFord 2012-02-02 18:24:57

回答

2

我認爲這是你的代碼中的一個錯誤。我不認爲你應該有一個SqlDataReaderSqlCommand這是由所有調用數據庫共享。

相反,您應該爲每個對數據庫的調用實例化一個新的SqlDataReaderSqlCommand,並在應用程序完成特定的SQL調用時處置(關閉)它們。

我的猜測是你的情況會發生什麼,SqlDataReaderSqlCommand被另一個數據庫調用從你的下拉出來,並且問題是間歇性的,因爲這是一個競爭條件。

+0

您是否建議將'SqlDataReader'和'SqlCommand'放入'using'塊中? – DFord 2012-02-02 19:41:04

+0

@Dord是的,這是絕對正確的。 – 2012-02-02 20:04:42

+0

我把'SqlDataReader'和'SqlCommand'放在''using'塊中,但它仍然不起作用。另外,從我的下拉出來的'SqlDataReader'和/或'SqlCommand'沒有意義,因爲數據庫是本地的,只有當應用程序在本地運行時纔會被訪問。一切工作,當我使用服務的數據庫。 – DFord 2012-02-03 14:38:43

3

這種錯誤通常會在您重置Sql服務器實例的連接時出現。

原因可能是由於重置網絡連接。

其他原因可能是:

您所請求的SQL Server和從連接池接收數據。現在SQL Server發生了一些不好的情況(服務重啓),並且你發回一個數據。

檢查以確保您的連接在後續請求之間不會中斷。

希望這會有所幫助。

+0

我在整個執行過程中檢查了連接,並且其狀態始終處於打開狀態。我仍然沒有看到數據顯示。 – DFord 2012-02-03 14:35:59

0

此問題是由於您尚未發佈數據庫連接。只需在您的代碼中添加Finally聲明並添加conn.Close()conn.Dispose()。我相信它會正常工作。

finally 
{ 
    cmd.Connection.Close(); 
    cmd.Connection.Dispose(); 
} 
相關問題