C# SQL 連接教程:Dapper + SQL Server資料庫解析
[[academy-video-youtube({"vid": "WGbTM198-eA", "start_time": "0", "title": "C# App Start To Finish Lesson 10 - SQL Connection", "creator": "Tim Corey", "length": "1h 15m 23s"})]]
在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命令和更高級的ORM(例如Entity Framework)之間。
Tim更喜歡Dapper是因為它是:
幾乎與原生ADO.NET一樣快
比Entity Framework更簡單
- 避免了不必要的複雜性和繁重樣板程式碼
他提到Entity Framework可能會更慢且更重,特別是對於小型應用程式來說。 對於他的專案,Dapper在性能和簡單性之間提供了合適的平衡。
安裝Dapper
Tim演示了通過Visual Studio中的NuGet包管理器安裝Dapper。 安裝完成後,Dapper出現在專案引用中,SQL連接程式碼變得乾淨且可讀。
新增連接字串
要使用Dapper,您需要一個連接字串。 Tim將其新增到UI項目的app.config文件中,而不是程式庫項目中,因為程式庫是DLL且沒有自己的配置。
連接字串包括:
資料來源(伺服器名稱或機器域名稱)
初始目錄(資料庫名稱)
整合安全性(Windows身份驗證)
連接超時
- 使用者ID和密碼(如果不使用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或文字文件)。
使用塊很重要,因為它確保在程式碼退出塊時自動關閉連接。 這避免了開放的連接可能耗盡連接池或導致資料庫伺服器上的錯誤。
建立儲存過程
Tim不是在C#中寫原生SQL,而是使用儲存過程。 這使得SQL邏輯保留在資料庫中,並減少了SQL注入等風險。
他建立了一個名為的儲存過程:
dbo.SP_Prizes_Insert此過程接受與獎品表匹配的參數:
@PlaceNumber
@PlaceName
@PrizeAmount
@PrizePercentage
- @ID(輸出)
輸出參數使用以下方式返回新生成的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。
因此,他更改了設計,以便一次只運行一個連接器。他新增了一個enum:
DatabaseType
{
SQL,
TextFile
}這確保應用程式始終使用一致的資料庫型別,並防止混合來自不同來源的資料庫資料。
結論
Tim Corey的第10課展示了使用Dapper將C#應用程式連接到SQL Server的實際方法。 他涵蓋了:
新增連接字串
使用SqlConnection
安全地打開和關閉連接
使用儲存過程
避免SQL注入
- 適用於多個資料源的正確架構
如果您想要一種乾淨、快速且易於維護的方式將C#連接到SQL Server資料庫,此課程是完美的指南。

