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和文本文件数据库的代码,并将启动表单更改为"创建奖品"表单,以便他可以立即测试数据库连接。
然后他通过创建两个文件夹来清理项目结构:
模型
- 数据访问
他说这不会影响源码功能,但有助于组织。 当您稍后返回项目时,干净的结构和一致的命名使得维护和扩展更加容易。
为什么使用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身份验证:
数据源=SQL2016;初始目录=锦标赛;集成安全性=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运行应用程序,填写表单,然后点击Create Prize。数据成功插入到SQL Server数据库中。 他测试了两者:
奖金金额
- 奖品比例
两者都工作,证明数据库连接和存储过程功能正常。
设计挑战:多个数据连接器(1:01:50)
Tim强调了一个设计问题:同时使用SQL和文本文件连接器会导致ID不一致。
因此他改变了设计,以便每次只有一个连接器运行。他添加了一个枚举:
数据库类型
{
SQL
文本文件
}这确保应用程序始终使用一致的数据库类型,并防止混合来自不同来源的数据库数据。
结论
Tim Corey的第10课展示了连接C#应用程序与SQL Server的现实世界方法,使用Dapper。 他涵盖了:
添加连接字符串
使用SqlConnection
安全地打开和关闭连接
使用存储过程
避免SQL注入
- 为多个数据源提供适当的架构
如果您想要一种干净、快速且可维护的方式将C#连接到SQL Server数据库,本课程是完美的指南。

