WinForms/WPF 多視窗應用中,每個視窗(Form/UserControl)都需要存取資料庫。若在每個視窗重複撰寫連線字串、using System.Data.OleDb、建立 OleDbConnection,會導致:
App.config / appsettings.json:
<connectionStrings>
<add name="Default" connectionString="Provider=SQLOLEDB;Data Source=.;Initial Catalog=MyDB;User ID=sa;Password=***" />
</connectionStrings>
public static class DbFactory
{
private static readonly string _connStr = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
public static IDbConnection CreateConnection() => new OleDbConnection(_connStr);
}
public abstract class RepositoryBase : IDisposable
{
protected readonly IDbConnection _conn;
protected RepositoryBase() => _conn = DbFactory.CreateConnection();
public void Dispose() => _conn?.Dispose();
}
public class UserRepository : RepositoryBase
{
public User GetById(int id)
{
const string sql = "SELECT * FROM Users WHERE Id = ?";
using (var cmd = _conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.Add(new OleDbParameter("?", id));
_conn.Open();
using (var reader = cmd.ExecuteReader())
return reader.Read() ? Map(reader) : null;
}
}
// ... CRUD 方法
}
public partial class UserForm : Form
{
private readonly UserRepository _repo;
public UserForm(UserRepository repo) { _repo = repo; InitializeComponent(); }
private void LoadData() => grid.DataSource = _repo.GetAll();
}
static class Program
{
[STAThread]
static void Main()
{
var repo = new UserRepository();
Application.Run(new UserForm(repo));
}
}
CreateConnection 即從池取用,無需手動管理Commit/Rollback將資料庫連線邏輯封裝於專屬層,視窗僅依賴抽象介面(Repository),透過建構函式注入具體實作。 這樣既解決了代碼重複、連線字串分散,又為未來遷移 ORM、單元測試、微服務化鋪平道路。