首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 類庫中共用資料庫連線的正確模式

     編輯:關於C#

在類庫專案中重複建立 SqlConnection 不僅冗餘,更易導致連線洩漏。本文說明為何應避免在每個方法中 `new SqlConnection()`,並示範使用連線字串設定檔、依賴注入或連線工廠模式集中管理連線生命週期。

原始碼問題分析

private SqlConnection MyConn() {
    string setting = ConfigurationManager.ConnectionStrings["myConnectionString"].ToString();
    SqlConnection thisConn = new SqlConnection(setting);
    return thisConn;
}

public string req_title(int id) {
    SqlConnection QConn = MyConn();           // 每次呼叫都 new 連線
    SqlDataAdapter myDap = new SqlDataAdapter("select article_title from t_article where art_id=" + id, QConn);
    DataSet myDS = new DataSet();
    myDap.Fill(myDS, "t_article");
    return (myDS.Tables[0].Rows[0][0].ToString());
}

缺點:

  • 連線字串硬編碼在方法中,難以維護。
  • 每次查詢開關連線,效能差;若忘記 Close/Dispose 會洩漏。
  • SQL 注入風險(字串串接 id)。
  • 類庫強依賴 System.Configuration,難以單元測試。

改進方向

1. 連線字串外部化 + 連線工廠

// 介面定義(方便測試替換)
public interface IDbConnectionFactory
{
    IDbConnection CreateConnection();
}

// 實作
public class SqlConnectionFactory : IDbConnectionFactory
{
    private readonly string _connStr;
    public SqlConnectionFactory(string connStr) => _connStr = connStr;
    public IDbConnection CreateConnection() => new SqlConnection(_connStr);
}

2. 類庫透過建構函式注入工廠

public class ArticleRepository
{
    private readonly IDbConnectionFactory _factory;
    public ArticleRepository(IDbConnectionFactory factory) => _factory = factory;

    public string GetTitle(int id)
    {
        using (var conn = _factory.CreateConnection())
        using (var cmd = conn.CreateCommand())
        {
            cmd.CommandText = "SELECT article_title FROM t_article WHERE art_id = @id";
            cmd.Parameters.AddWithValue("@id", id);
            conn.Open();
            return cmd.ExecuteScalar()?.ToString();
        }
    }
}

3. 應用層組裝(以 ASP.NET Core 為例)

// Startup.cs
services.AddTransient(_ => 
    new SqlConnectionFactory(Configuration.GetConnectionString("Default")));

services.AddTransient();

進階:使用 Dapper 簡化 ADO.NET

using Dapper;

public string GetTitle(int id)
{
    using (var conn = _factory.CreateConnection())
    {
        return conn.QueryFirstOrDefault(
            "SELECT article_title FROM t_article WHERE art_id = @id", new { id });
    }
}

總結原則

  • 連線生命週期由呼叫端控制:`using` 區塊確保釋放。
  • 連線建立邏輯集中化:工廠模式 + DI。
  • 參數化查詢:防 SQL 注入。
  • 類庫不直接讀 ConfigurationManager:提升可測試性與複用性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved