IRONSOFTWAREHOME

C# SQL连接教程:Dapper + SQL Server数据库解析

C# 应用程序从开始到完成第10课 - SQL 连接

Tim Corey

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和文本文件数据库的代码,并将启动表单更改为"创建奖品"表单,以便他可以立即测试数据库连接。

然后他通过创建两个文件夹来清理项目结构:

  • 模型

  • 数据访问

他说这不会影响源码功能,但有助于组织。 当您稍后回到项目时,干净的结构和一致的命名使维护和扩展变得更容易。

为什么使用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;
Text

他强调通过这种方式避免了在文件中存储SQL Server用户凭据。

GlobalConfig:获取连接字符串

为了检索连接字符串,Tim在GlobalConfig中添加了一个方法:

public static string GetConnectionString(string name)
{
    return ConfigurationManager.ConnectionStrings[name].ConnectionString;
}
Text

此方法从配置文件中提取连接字符串并返回。 Tim还添加了所需的System.Configuration引用。

创建SQL连接

Tim移除了占位代码,并使用以下代码创建了一个真实的SqlConnection:

using (IDbConnection connection = new SqlConnection(
    GlobalConfig.GetConnectionString("tournaments")))
{
    // 这里是SQL逻辑
}
Text

他使用了IDbConnection接口,因此他可以在不改变核心代码的情况下更改单库类型(SQL或文本文件)。

使用块很重要,因为它确保连接在代码退出块时自动关闭。 这样避免了打开的连接,这可能会耗尽连接池或导致数据库服务器错误。

创建存储过程

Tim不在C#中编写原始SQL,而是使用了存储过程。 这将SQL逻辑保持在数据库中,并减少了诸如SQL注入的风险。

他创建了一个名为的存储过程:

dbo.SP_Prizes_Insert
Text

此过程接受与奖品表匹配的参数:

  • @PlaceNumber

  • @PlaceName

  • @PrizeAmount

  • @PrizePercentage

  • @ID(输出)

输出参数使用以下方式返回新生成的ID:

SELECT @ID = SCOPE_IDENTITY()
Text

这确保新记录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);
Text

ID被标记为输出,Dapper处理参数映射。

执行存储过程

他执行了存储过程:

connection.Execute("dbo.SP_Prizes_Insert", p, commandType: CommandType.StoredProcedure);
Text

使用Execute是因为它执行插入操作,不像SELECT语句那样返回行。

执行后,代码检索ID:

model.ID = p.Get<int>("@ID");
return model;
Text

测试与结果

Tim运行应用程序,填写表单,然后点击Create Prize。数据成功插入到SQL Server数据库中。 他测试了两者:

  • 奖金金额

  • 奖品比例

两者都工作,证明数据库连接和存储过程功能正常。

设计挑战:多个数据连接器(1:01:50)

Tim强调了一个设计问题:同时使用SQL和文本文件连接器会导致ID不一致。

因此他改变了设计,以便每次只有一个连接器运行。他添加了一个枚举:

数据库类型
{
    SQL
    文本文件
}
Text

这确保应用程序始终使用一致的数据库类型,并防止混合来自不同来源的数据库数据。

结论

Tim Corey的第10课展示了连接C#应用程序与SQL Server的现实世界方法,使用Dapper。 他涵盖了:

  • 添加连接字符串

  • 使用SqlConnection

  • 安全地打开和关闭连接

  • 使用存储过程

  • 避免SQL注入

  • 为多个数据源提供适当的架构

如果您想要一种干净、快速且可维护的方式将C#连接到SQL Server数据库,本课程是完美的指南。

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户