2014-03-07 131 views
0

我正在C#中的Windows服務工作,也許我可能會在我的Web應用程序中使用相同的方法,如果它的工作。主服務使用一個用於自身的sqlconnection,它使用ConfigurationManager從app.config中檢索,並創建一些不同類型的線程來運行多個任務。每個線程都有自己的連接(存儲在類屬性中)。是公共靜態sql連接安全

public partial class MainService : ServiceBase{ 
    private static string SQLConnStr; 
    protected static SqlConnection SQLConn; 
} 

class OtherClass{ 
    private sqlconnection sqlconn; 
    private string connstr; 

} 

,我堅持的部分,是當我創建另一個對象類型,我需要使用對象OtherClass'連接才能訪問數據庫。這個新對象是在OtherClass中創建並調用的,以供稍後處理。

是否有可能重新使用從OtherClass的SQL連接? 將sql連接字符串設置爲公共靜態是否安全? 我使用的設計不好嗎?

+1

最好的做法是把你的連接字符串放在Web.config文件中。 –

+1

你想要的答案取決於情況。如果它是一個類庫,一切都將被編譯成一個DLL。在這種情況下,使用該DLL的人也可以訪問連接字符串(如果它是公共的)。我認爲這不安全。 –

+0

你是說如果我把類放在一個dll中,不管它是私人還是公共? – cSharpDev

回答

-1

我喜歡你的答案,但我的設計很糟糕,經過一段時間的研究。所以我決定在MainService創建一個公共靜態查詢功能:

public static void qQuery(string querystr){ 
    using(sqlconnection conn = new sqlconnection(sqlconnstr){ 
     ..... 
    } 
} 

sqlconnstr是MainService私人字符串服務啓動時初始化。

我希望它是安全可靠的做法...

2

將它傳遞給OtherClass的構造函數?

細節與例子

public partial class MainService : ServiceBase{ 
    private string SQLConnStr; 
} 

class OtherClass{ 
    private string connstr; 
    public OtherClass(string _connstr) { this.connstr = _connstr; } 
    public foo() { using(var conn = new SqlConnection(connstr) { ... } } 
} 

創建new SqlConnection每次都是在.NET罰款,因爲有連接池。

+0

這將是最後的手段。我不喜歡這樣做。 – cSharpDev

+0

@cSharpDev然後祝你好運,調用主線程 – Cynede

+0

@ Heather:讓我們看看,其他誰回答了同樣的問題,似乎你是一種奇怪的人呢?這似乎是基於你在你的答案下的論點,我希望你能夠理解,更多的人在你認爲的那種方式上有所不同,你認爲這是一個適合的答案。你說'把它傳遞給OtherClass的構造函數?'現在是一個問題或答案似乎混淆了第三人不是它 –

1

您應該使用相應的配置機制。對於應用程序/ Windows服務,這將是app.config文件,對於Web應用程序它將是web.config文件,對於DLL,應該將這些設置從DLL的app.config複製到應用程序的app.config/web.config,如多次描述(DLL不讀取它們配置文件,所以設置需要進入應用程序的配置文件)。

這就是說:使用Visual Studio中的設置設計器來簡單地添加一個新的連接字符串設置。如有必要,也可以將其添加到其他項目中。

要使用同一個項目中的類的連接字符串,可以簡單地使用Settings.Default.MyConnectionString,假定該設置名爲MyConnectionString

DLL的另一個例外:某些DLL不需要自己的設置,但需要訪問數據庫。在這種情況下,您可以將連接字符串或甚至SqlConnection傳遞給需要訪問數據庫的函數。

+0

我知道。我所追求的只是依靠標準設置機制,然後在整個代碼中使用該設置或將其傳遞給DLL。我讀過這個問題,你知道嗎? :d –

1

connection * string *和連接本身之間存在區別。對於連接字符串(描述你應該連接到哪裏),你可以將它存儲在一個配置文件中,以便你可以輕鬆地改變它。

用於與數據庫通信的連接本身必須打開和關閉。使用數據採集器時,通常不能將同一連接用於同時執行的命令。 儘可能遲地打開新連接並儘快關閉。讓內置連接池來優化真正的連接。