2014-01-29 89 views
1

我正在創建一個應用程序,在此連接到Access數據庫並執行多個更新。由於我不是數據庫程序員,這也是一種學習體驗。我在網上找到了下面的代碼,但是直到我添加了connection.open()這一行後,它才起作用。爲什麼我需要在使用塊內使用odbcconnection.open

所以這是我的問題。我認爲,就像在其他使用情況下創建文件一樣,它會自動打開連接,然後在最後的}處置。爲什麼在創建一個新連接之後,我必須明確地調用open命令?

private static void GetAllTableAndColumnNames(string connectionString) 
{ 
    using (OdbcConnection connection = 
     new OdbcConnection(connectionString)) 
    { 
     connection.Open(); 
     DataTable tables = connection.GetSchema("Tables"); 
     DataTable columns = connection.GetSchema("Columns"); 

     foreach (DataRow row in columns.Rows) 
     { 
      Console.WriteLine(row["COLUMN_NAME"].ToString()); 
      Console.WriteLine(row["TABLE_NAME"].ToString()); 
     } 
     Console.Read(); 
    } 
} 

這是我在運行時得到的錯誤,沒有打開命令。

在System.Data.dll中發生未處理的System.InvalidOperationException類型的異常 其他信息:無效的操作。連接已關閉。

+1

http://stackoverflow.com/questions/4717789/in-a-using-block-is-a-sqlconnection-closed-on-return-or-exception –

回答

1

當代碼到達using塊的末尾時,它知道Connection對象即將被銷燬,因此通過確保連接正確關閉,「對你有利」。這是因爲在不通知服務器的情況下簡單地銷燬連接對象將是不合理的:服務器連接通常是寶貴的商品,並且在服務器上留下孤立的連接「打開」將是一件壞事。

另一方面,創建連接對象時自動打開連接(即using語句本身)並不一定是件好事。也許你想創建你的Connection對象,然後創建一大堆依賴於Connection對象的其他對象(例如Command,DataAdapter等)。在發生這種情況時,連接實際上是否需要打開?如果沒有,那麼如果連接到繁忙的服務器,那麼在整個時間內連接打開也可能不合理。

或者換句話說,爲什麼一個Connection對象可能會在狀態「開放」和「關閉」之間切換狀態的時候有一個非常合理的原因,但是它在它死亡的時刻應該是唯一的狀態關閉了」。這就是爲什麼有「自動關閉」行爲,但不是相應的「自動打開」。

+0

很好的答案。感謝您使這一切變得更加清晰。 – Mathitis2Software

0

使用子句旨在當變量超出範圍時關閉automaticlly資源。構造函數中的行爲取決於實現:DbConnection後代不會在構造函數中打開連接。

我認爲這是因爲構造函數重載:有些重載沒有參數,所以無法打開數據庫。

相關問題