C# SQL 連接教程:Dapper + SQL Server 數據庫解釋
在 Tim Corey 的 "C# App Start to Finish" 系列的第 10 課中,Tim 解釋了如何使用 Dapper 將 C# 應用程式連接到 SQL Server 資料庫。 在上一課中,該應用使用了一個假的資料存取層,它只是假裝在與 SQL 通信。 在這個影片中,Tim 用真正的 SQL 連接 邏輯替換了這段佔位符程式碼,並展示了他如何以乾淨、可擴展且易於維護的方式設置真實的資料庫連接。
這篇文章分解了 Tim 涵蓋的關鍵概念,即使您是 C# SQL 連接或 SQL Server 新手,也能理解得很清楚。
專案設置與清理
Tim 首先檢查了解決方案結構,並確認了上一課所做的更改。 在 Program.cs 中,他解釋說,為了測試資料庫連接,他新增了連接 SQL Server 和文本檔資料庫的程式碼,並將啟動表單變更為"建立獎品"表單,以便能立即進行測試。
然後,他通過創建兩個資料夾來整理專案結構:
-
Models
- DataAccess
他指出,這不會影響源代碼功能,但有助於組織。 當您稍後返回專案時,乾淨的結構和一致的命名使維護和擴展變得容易得多。
為什麼選擇 Dapper?
Tim 解釋說,他將使用 Dapper 作為 SQL 連接的 ORM(物件關聯映射器)。 Dapper 介於原生 SQL 指令和像 Entity Framework 這樣的高級 ORM 之間。
Tim 選擇 Dapper 的原因包括:
-
幾乎和原生 ADO.NET 一樣快
-
比 Entity Framework 更簡單
- 避免不必要的複雜性和大量樣板代碼
他提到 Entity Framework 可能速度較慢且較重,特別是對於小型應用程式而言。 對於他的專案,Dapper 在性能和簡單性之間提供了合適的平衡點。
安裝 Dapper
Tim 演示了如何通過 Visual Studio 中的 NuGet 封裝管理器安裝 Dapper。 安裝後,Dapper 出現在專案引用中,並且 SQL 連接程式碼顯得既乾淨又易讀。
添加連接字串
要使用 Dapper,您需要一個連接字符串。 Tim 將它添加到 UI 專案的 app.config 文件中,而不是程式庫專案,因為程式庫是 DLL,沒有自己的配置。
連接字符串包括:
-
Data Source(伺服器名稱或機器域名)
-
Initial Catalog(資料庫名稱)
-
Integrated Security (Windows 驗證)
-
Connection Timeout
- User ID 和 Password(如果不使用 Windows 驗證)
在 Tim 的範例中,他使用了受信任的連接,即 Windows 驗證:
Data Source=SQL2016;Initial Catalog=Tournaments;Integrated Security=True;
他強調這樣做可以避免在文件中儲存 SQL Server 使用者帳戶憑證。
GlobalConfig: 獲取連接字串
為了獲取連接字串,Tim 在 GlobalConfig 中新增了一個方法:
public static string GetConnectionString(string name)
{
return ConfigurationManager.ConnectionStrings[name].ConnectionString;
}
此方法從配置文件中提取連接字符串並返回它。 Tim 還添加了所需的 System.Configuration 引用。
建立 SQL 連接
Tim 移除了佔位符程式碼,並使用以下方式創建了一個真實的 SqlConnection:
using (IDbConnection connection = new SqlConnection(
GlobalConfig.GetConnectionString("tournaments")))
{
// 在此處編寫 SQL 邏輯
}
他使用了一個 IDbConnection 介面,因此可以在不更改核心代碼的情況下交換資料庫類型(SQL 或文本文件)。
using 塊很重要,因為它確保在程式碼退出塊時自動關閉連接。 這樣可以避免開啟的連接耗盡連接池或導致資料庫伺服器上的錯誤。
創建儲存過程
Tim 不再在 C# 中編寫原生 SQL,而是使用儲存過程。 這樣可以將 SQL 邏輯保留在資料庫中,並降低 SQL 注入等風險。
他創建了一個名為的儲存過程:
dbo.SP_Prizes_Insert
此過程接受與獎品表匹配的參數:
-
@PlaceNumber
-
@PlaceName
-
@PrizeAmount
-
@PrizePercentage
- @ID (output)
輸出參數使用以下指令返回新生成的 ID:
SELECT @ID = SCOPE_IDENTITY()
這確保新記錄的 ID 返回到 C# 應用中。
Dapper 中的動態參數
回到 C# 中,Tim 使用 Dapper 的 DynamicParameters 將參數發送到儲存過程:
var p = new DynamicParameters();
p.Add("@PlaceNumber", model.PlaceNumber);
p.Add("@PlaceName", model.PlaceName);
p.Add("@PrizeAmount", model.PrizeAmount);
p.Add("@PrizePercentage", model.PrizePercentage);
p.Add("@ID", 0, dbType: DbType.Int32, direction: ParameterDirection.Output);
ID 被標記為輸出,Dapper 處理參數映射。
執行儲存過程
他執行了儲存過程:
connection.Execute("dbo.SP_Prizes_Insert", p, commandType: CommandType.StoredProcedure);
使用 Execute,因為它執行插入操作而不像 SELECT 查詢那樣返回行。
執行之後,程式碼檢索到 ID:
model.ID = p.Get<int>("@ID");
return model;
測試及結果
Tim 運行了應用程式,填寫表單並點擊創建獎品。數據成功插入了 SQL Server 資料庫。 他測試了兩者:
-
獎金
- 獎品百分比
兩者都有效,證明資料庫連接和儲存過程運行正常。
設計挑戰:多個資料連接器(1:01:50)
Tim 強調了一個設計問題:同時使用 SQL 和文本文件連接器會導致 ID 不一致。
因此,他改變了設計,使得一次只運行一個連接器。他新增了一個枚舉:
DatabaseType
{
SQL,
TextFile
}
這確保應用程式始終使用一致的資料庫類型,並防止來自不同來源的資料庫數據混合。
結論
Tim Corey 的 第 10 課 展現了使用 Dapper 連接 C# 程式到 SQL Server 的實際方法。 他涵蓋了:
-
添加連接字符串
-
使用 SqlConnection
-
安全地開啟和關閉連接
-
使用儲存過程
-
避免 SQL 注入
- 為多個資料來源設計合理的架構
如果您想要一種將 C# 連接到 SQL Server 資料庫的乾淨、快速和易於維護的方法,本課程是一個完美的指導。
