2011-05-25 40 views
0

我們有一個簡單的循環過程,它在某些數據行上執行某些操作。我的.Net SqlConnection對象是否自己關閉

當提交更改新行並將SqlConnection對象傳遞給處理行更改或添加的方法時。

該過程運行5次,滿分10分均可。 SqlConnection在循環開始時打開,在循環結束後關閉,但有時它在循環中確實關閉。代碼在循環過程中的任何時刻都不會調用close()。

所以我的問題是爲什麼它可能會自己關閉。

乾杯

的代碼類似於以下

connection.Open(); 

foreach(DataRow row in rows) 
{ 
    if(rubbish) 
{ 
    //make some changes and save 
    DatabaseConnector.Save(sqlStringToExecute, connection); 
} 
} 

connection.Close(); 
+3

你能顯示你的代碼嗎?它會讓你的問題更清楚。 – 2011-05-25 08:35:05

+0

也許你應該爲每個操作使用幾個連接? – Cynede 2011-05-25 08:36:35

+0

永遠不要做類似上面的代碼,如果發生任何事情並拋出異常,您的連接將不會關閉,您聲明的地方使用Using語句,因此在任何情況下連接都將被關閉並在超出範圍時處理。 – 2011-05-25 08:47:16

回答

1

的連接不會關閉自身,沒有一個參考。主要倍的連接將關閉將是:(通過using聲明例如)

  • 處置
  • 命令與CommandBehaviour.CloseConnection行爲
  • 垃圾收集執行Close()
  • 顯式調用 - 種-of(雖然實際上有點不同)
  • 服務器不再可用

如果您確實發生異常(可能是超時或死鎖),彈出using塊(處置它),並且可能吞嚥該異常,則第一種非常有可能。

第三個很好的代碼很可能。

爲了進行調查,您可以訂閱StateChange事件並在處理程序中添加一個斷點;然後向後走過堆棧軌跡,您將知道正好是誰正在關閉它,以及爲什麼。如果您使用超出此代碼範圍的連接,請記得取消訂閱。

+0

真的和上面的例子一樣簡單。連接傳遞給執行sql並退出的方法。有時在循環過程中它是一個關閉的連接,再次運行應用程序並且它工作正常。堆棧跟蹤等,並在調用堆棧後顯示任何你不能看到上面。確實很奇怪。 – Robert 2011-05-25 08:43:16

+0

@Robert - 然後hook StateChange來找出爲什麼 – 2011-05-25 08:44:01

+0

你意味着鉤入連接的statechanged事件? – Robert 2011-05-25 08:44:54

相關問題