| 數據庫 | 提供者/驅動 | 標準連接字符串模板 | 關鍵參數 |
|---|---|---|---|
| SQL Server | System.Data.SqlClient / Microsoft.Data.SqlClient | Server=myServer;Database=myDB;User Id=sa;Password=pwd;TrustServerCertificate=True; | TrustServerCertificate (本地開發), Encrypt, Connection Timeout |
| PostgreSQL | Npgsql | Host=localhost;Database=myDB;Username=postgres;Password=pwd;Pooling=true; | Pooling, Command Timeout, SSL Mode |
| MySQL | MySql.Data / MySqlConnector | Server=localhost;Port=3306;Database=myDB;Uid=root;Pwd=pwd;CharSet=utf8mb4; | CharSet=utf8mb4 (存 Emoji), SslMode, AllowPublicKeyRetrieval |
| Oracle | Oracle.ManagedDataAccess.Core | Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ora)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=scott;Password=tiger; | TNS_ADMIN, Wallet (ATP), Pooling |
| SQLite | Microsoft.Data.Sqlite | Data Source=app.db;Cache=Shared;Mode=ReadWriteCreate; | Cache=Shared (多線程), Foreign Keys=True |
| Access | System.Data.OleDb | Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\data.accdb;Persist Security Info=False; | 需安裝 ACE Engine, .accdb 用 12.0, .mdb 用 4.0 |
// 1. 配置文件 appsettings.json / web.config
{
"ConnectionStrings": {
"Default": "Server=.;Database=MyApp;User=sa;Password=P@ssw0rd;TrustServerCertificate=True;"
}
}
// 2. DbContext / 連接工廠註冊
public static class DbFactory
{
private static readonly string _connStr = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
// ADO.NET 原生連接(高性能、Dapper 友好)
public static SqlConnection CreateConnection() => new SqlConnection(_connStr);
// Entity Framework Core
public static DbContextOptions CreateOptions() =>
new DbContextOptionsBuilder()
.UseSqlServer(_connStr, o => o.EnableRetryOnFailure(3))
.EnableSensitiveDataLogging(false) // 生產關閉
.Options;
}
// 3. 正確使用模式:using 確保釋放
public async Task> GetUsersAsync()
{
const string sql = "SELECT Id, Name, Email FROM Users WHERE IsActive=1 ORDER BY Id";
using var conn = DbFactory.CreateConnection();
await conn.OpenAsync();
return (await conn.QueryAsync(sql)).AsList(); // Dapper
}
// 4. 參數化查詢(防注入、計劃緩存)
public async Task GetByIdAsync(int id)
{
using var conn = DbFactory.CreateConnection();
return await conn.QueryFirstOrDefaultAsync(
"SELECT * FROM Users WHERE Id = @Id", new { Id = id });
}
// 5. 連接池優化:保持連接字符串完全一致
// 不要在運行時拼接字符串,改用 Configuration / IOptions 讀取
| 參數 | 推薦值 | 作用 |
|---|---|---|
| Pooling | true (默認) | 啟用連接池,極大降低 Open/Close 開銷 |
| Min Pool Size | 0-5 | 預熱連接數,冷啟動優化 |
| Max Pool Size | 100 (默認) | 根據並發調整,防止連接耗盡 |
| Connection Lifetime | 0 (默認) | 連接生存秒數,0=永不主動銷毀 |
| Connect Timeout | 15-30 | 建立連接最長等待,防止無限阻塞 |
| Command Timeout | 30-120 | 單條 SQL 執行超時,防止長查詢佔用連接 |
| Encrypt / TrustServerCertificate | True / True (開發) | TLS 加密,生產建議 True/False 搭配有效證書 |
using / Close()、長事務、MaxPoolSize 過小。CharSet=utf8mb4,表/列字符集一致;SQL Server 使用 N 前綴參數 N'中文'。tnsnames.ora 或改用 Easy Connect 字符串。// Program.cs / Startup.cs
builder.Services.AddDbContext(options =>
options.UseSqlServer(builder.Configuration.GetConnectionString("Default"),
sql => sql.EnableRetryOnFailure(3, TimeSpan.FromSeconds(5), null)));
// Repository 注入
builder.Services.AddScoped();
// 控制器使用
public class UserController : ControllerBase
{
private readonly IUserRepository _repo;
public UserController(IUserRepository repo) => _repo = repo;
}
掌握標準連接字符串、參數化查詢、連接池配置、依賴注入整合,即可覆蓋 99% .NET 數據庫訪問場景,代碼安全、高效、可維護。