2010-05-21 44 views
0

這很有趣(對我來說),我想看看是否有人對此行爲有很好的回答和解釋。假設你有一個單獨的數據庫對象(或靜態數據庫對象),並且它將它存儲在類Foo中。圍繞靜態/單例資源參考使用塊

public class Foo 
{ 
    public static SqlConnection DBConn = new SqlConnection(ConfigurationManager.ConnectionStrings["BAR"].ConnectionString); 
} 

然後,可以說你是認識到調用和處理您的連接的有用性(假裝在這個例子中,其用於說明目的一次性使用)。所以你決定使用'use'塊來處理Dispose()調用。

using (SqlConnection conn = Foo.DBConn) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.CommandType = System.Data.CommandType.StoredProcedure; 
     cmd.CommandText = "SP_YOUR_PROC"; 

     cmd.ExecuteNonQuery(); 
    } 
    conn.Close(); 
} 

此操作失敗,在電話會議上拋出一個異常,打開連接,並指出,「ConnectionString屬性未初始化」。從app.config/web.config中拉取連接字符串不是問題。當您在調試會話中進行調查時,您會看到Foo.DBConn不爲空,但包含空屬性。

這是爲什麼?

回答

0

也許你在web/app.config中沒有相應的connectionStrings節點?

<connectionStrings> 
<add name="BAR" 
    connectionString="Data Source=localhost\sqlexpress;Initial Catalog=mydatabase;User Id=myuser;Password=mypassword;" /> 

+0

沒有它的存在。如果您使用代碼的非靜態變體,則可以證明它的工作原理。 – 2010-05-21 16:00:53

2

一點點出來的話題並沒有真正回答你的問題,但爲什麼使用SqlConnection的一個單身時,ADO.NET已經使用了連接池?您的代碼可能已經很好地是這樣的:

using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["BAR"].ConnectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.Connection = conn; 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "SP_YOUR_PROC"; 
    cmd.ExecuteNonQuery(); 
} 

,一個在你的程序擔心少一點:連接生命週期

+0

因爲這是一個語言古怪的問題,而不是一個建築:)謝謝輸入。 – 2010-05-21 16:01:29

-1

的靜電場被評爲有時 在使用前 (不確定性)。有關更多詳細信息,請參閱beforefieldinit。因此,系統在被調用時可能無法創建SQL連接,或者甚至可以在使用之後正確創建靜態字段

此外,在關閉第一個SQL命令後,如何處理第二個SQL命令?我不清楚SqlConnection是如何工作的,但是在關閉(注意這個cals Dispose)和處理連接之後,你的靜態Foo.DBConn應該消失了,也就是說它不會被重新評估。

如果你想讓你的基礎設施,我會返回上獲得一個新的SqlConnection的靜態屬性替換靜態字段:

public static SqlConnection DBConn 
{ 
    get 
    { 
     return new SqlConnection(ConfigurationManager.ConnectionStrings["BAR"].ConnectionString); 
    } 
} 
+0

您錯過了原始帖子中的部分內容(假設本例中它是一次性用於說明目的)「 – 2010-05-21 16:00:05

+0

@byte您錯過了我的帖子中的部分內容:」靜態字段有時會進行評估用過的」。 – 2010-05-21 16:27:24

+0

不,我發現這一點,並且您錯誤地將我的評論用於總結您的帖子,而不是您正在處理的帖子的具體上下文。如果您覺得需要繼續,請隨時通知我。 – 2010-05-21 23:11:54