

新闻资讯
技术学院Dapper不直接支持执行SQL脚本文件,需先读取文件内容为字符串,再按GO分隔符分割语句,最后逐条调用Execute在事务中执行。
Dapper 本身不直接支持执行 SQL 脚本文件(如 .sql 文件),它只是一个轻量级的 ORM,只负责将 SQL 字符串映射到对象或执行单条/批量命令。要运行一个完整的 SQL 脚本文件(比如包含多条语句、GO 分隔、注释、条件逻辑等),你需要先读取文件内容,再手动解析并分段执行。
最基础的一步是把 SQL 脚本加载为字符串:
File.ReadAllText("script.sql") 或异步版本 File.ReadAllTextAsync
AppContext.BaseDirectory 构建相对路径SQL Server 的 GO 不是 T-SQL 语句,而是客户端工具(如 SSMS)识别的批处理分隔符。Dapper 不认识 GO,必须手动切分:
-- 或 /*...*/ 需简单过滤)GO(忽略前后空格)就作为语句边界SqlScript 类,或轻量解析器如 Microsoft.Data.SqlClient.Scripts(.NET 6+)Regex.Split(content, @"^\s*GO\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline)
拿到语句数组后,逐条传给 Dapper 执行(注意:不能用 Query/QuerySingle,要用 Execute):
connection.Execute(sqlStatement, transaction: trans) —— 推荐在事务中执行,保证原子性SET ANSI_NULLS ON),需确保都在同一连接+同一事务中执行以下是一个最小可行示例(无复杂注释处理,仅支持 GO 分割):
var script = File.ReadAllText("init.sql");
var statements = Regex.Split(script, @"^\s*GO\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline);
using var conn = new SqlConnection(connStr);
conn.Open();
using var trans = conn.BeginTransaction();
try
{
for
each (var stmt in statements.Select(s => s.Trim()).Where(s => !string.IsNullOrEmpty(s)))
{
conn.Execute(stmt, transaction: trans);
}
trans.Commit();
}
catch
{
trans.Rollback();
throw;
}
基本上就这些。Dapper 不做脚本解析,但配合基础 IO 和简单文本处理,完全能胜任 SQL 脚本部署任务。关键点是:读得准、切得对、执行稳(加事务)、错得清(有回滚)。