簡體   English   中英

如何使用實用程序類管理SQL連接?

[英]How to manage SQL Connections with a utility class?

我們有一個SQL實用程序類,它將存儲過程的名稱作為其輸入參數,並在datatable中返回結果。 這背后的原因是我們不必擔心忘記關閉連接和連接泄漏。 此外,我們可以通過不必在數據訪問層中重新創建數據適配器和數據引導來減少代碼。

我遇到的問題是我們正在填充一個數據表,以便我們可以遍歷它來創建我們的對象,所以我們基本上像一個datareader一樣使用它。 我已經讀過將返回datareader或dataadapter的類。 但問題是客戶端必須打開和關閉連接,或者您必須在Finalize方法中關閉連接。 您似乎不希望垃圾回收負責關閉數據庫連接。

總而言之,我們希望有一個類,這樣我們就可以通過不必為每個查詢創建數據引導來減少代碼,從而確保數據庫連接被關閉。

處理這個問題的最佳方法是什么?

更新:還在考慮這一點,但到目前為止,似乎最好的做法是仍然返回一個datareader,使用CommandBehavior.CloseConnection,然后信任誰曾經使用該類調用dr.Close()?

您是否考慮過Microsoft企業庫

public List<User> GetUsers()
{
    List<User> result = new List<User>();

    Database db = new
    Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase(this.connectionString);
    DbCommand cmd = db.GetStoredProcCommand("GetUsers");

    using (IDataReader rdr = db.ExecuteReader(cmd))
    {
        while (rdr.Read())
        {
            User user = new User();
            FillUser(rdr, user);                   
            result.Add(user);
        }
    }
    return result;

}

我們使用這樣的東西,它在高音量下表現很好。

    public SqlDataReader ExecuteReader(string command, SqlParameter[] parameters)
    {
        SqlDataReader reader = null;

        using (SqlConnection conn = new SqlConnection())
        using (SqlCommand cmd = conn.CreateCommand())
        {
            conn.Open();

            cmd.CommandText = command;
            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.AddRange(parameters);

            reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
        }

        return reader;
    }

DataTables由於其膨脹和缺乏類型安全性等多種原因而不被視為最佳實踐。

我有相同的結構 - 實用程序類,其方法可以獲取數據並返回填充的DataTables(或填充/更新傳遞給它們的DataTable) - 原因完全相同:保持數據庫連接與其余代碼分開並確保它們僅在需要時打開並盡快關閉。 特別是因為數據存儲在各種后端系統中,我想只向我的應用程序提供一個接口,而不用擔心細節。

您的情況有一個區別:我們(通常)不會從​​DataTables中的行創建對象,而是直接處理行中的數據。 我發現使用DataTables簡單而有效。

除此之外,我個人認為這種方法沒有任何問題,並且發現它對我們的目的非常有效。

返回datareader在很多場景中都不起作用。 在很多地方,生產中不允許從客戶端機器直接連接到數據庫(有充分理由)。 因此,您必須序列化要檢索的對象。 我可以想到一些設計,它們可以讓你在服務器端用於遠程處理/序列化的任何類中堅持使用datareader,但是通過痛苦的行方式在http或nettcp中返回項目可能不會帶來太多好處。

你在序列化這些對象嗎? 如果是這樣,您的選擇將歸結為Datatable,Dataset或自定義對象。 自定義對象,如果寫得好,執行和序列化最好,但除了一堆其他功能外,你還必須編寫並發。

IMO,自ADO.Net 2.0以來,即使在大規模遠程處理情況下,數據表也能很好地運行。 它們提供了特殊的二進制遠程處理格式,並且易於使用。 拋出一些壓縮,你甚至沒有為大型數據集使用大量帶寬。

好吧,如果您計划在網頁中使用此類,則可以使用頁面的卸載事件注冊實用程序類。 在事件接收器中,您可以編寫邏輯來關閉數據庫連接。 在codeproject上查看此提示以獲取更多想法

但是,此解決方案不適用於Web方法(Web服務)。 我想你必須適應這項技術用於Web服務。 Web方法的最后一行應該是事件調用。 因此,在編寫Web服務類時,請定義名為WebMethodCompleted的事件。 您可能會通過本文中提到的技術獲得對Web服務實例的引用。 獲得參考后,您可以在實用程序類中注冊該事件。 只記得在web方法中調用該事件。

快樂的編程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM