You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dapper传递对象作为Execute参数报错的技术咨询

Dapper参数绑定错误及集合批量处理解决方案

一、当前报错的原因及修复

你遇到的Must declare the scalar variable "@a"错误,核心原因是参数传递方式不符合Dapper的映射规则:
当你传入new { test }时,Dapper会将其解析为嵌套对象参数,对应的参数名应为@test.a和@test.b,但你的SQL语句里用的是@a和@b,数据库自然找不到这些未声明的变量。

修复方法有两种:

  1. 直接传入Test对象作为参数(最简洁的方式)
connection.Execute(insertStmt, test);

Dapper会自动将Test对象的a、b属性映射到SQL中的@a、@b参数。

  1. 手动展开对象属性(适合需要混合其他参数的场景)
connection.Execute(insertStmt, new { a = test.a, b = test.b });

二、Test对象集合的批量处理方式

方式1:循环单条插入(适合中小规模数据)

直接将集合作为参数传入Execute方法,Dapper会自动遍历集合,为每个对象执行一次插入:

var testList = new List<Test>
{
    new Test { a = 1, b = "value1" },
    new Test { a = 2, b = "value2" }
};

connection.Execute(insertStmt, testList);

方式2:表值参数(TVP)批量插入(适合大规模数据,性能更优)

这种方式仅需一次数据库交互,性能远高于循环插入,步骤如下:

  1. 先在SQL Server中创建对应的表值类型:
CREATE TYPE TestType AS TABLE (a int, b varchar(10));
  1. 在C#中构建DataTable并传递:
var testList = new List<Test>
{
    new Test { a = 1, b = "value1" },
    new Test { a = 2, b = "value2" }
};

var dataTable = new DataTable();
dataTable.Columns.Add("a", typeof(int));
dataTable.Columns.Add("b", typeof(string));

foreach (var item in testList)
{
    dataTable.Rows.Add(item.a, item.b);
}

var bulkInsertSql = @"
INSERT INTO Test(a, b)
SELECT a, b FROM @TestTable";

connection.Execute(bulkInsertSql, new { TestTable = dataTable.AsTableValuedParameter("TestType") });

内容的提问来源于stack exchange,提问作者Slavik Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:33:27