Dapper ExecuteAsync 得到一个 SQLException:列名或提供的值的数量与表定义不匹配
Posted
技术标签:
【中文标题】Dapper ExecuteAsync 得到一个 SQLException:列名或提供的值的数量与表定义不匹配【英文标题】:Dapper ExecuteAsync get a SQLException: Column name or number of supplied values does not match table definition 【发布时间】:2018-01-28 04:37:18 【问题描述】:我使用 Dapper ExecuteAsync
方法执行带参数的 SQL 查询。
insertedId =await connection.ExecuteAsync(query,params, transaction);
但是出现这个错误:
"列名或提供的值数与表不匹配 定义。”
良好的表定义:
[Id] [int] IDENTITY(1,1) NOT NULL,
[Code] [nvarchar](50) NULL,
[Title] [nvarchar](200) NOT NULL,
[GoodEnumId] [int] NOT NULL,
[Date] [datetime] NOT NULL,
[IsActive] [bit] NOT NULL,
[IsDeleted] [bit] NOT NULL,
以及 PaperDetail 表定义:
[Id] [int] IDENTITY(1,1) NOT NULL,
[GoodId] [int] NOT NULL,
[Length] [float] NULL,
[Width] [float] NULL,
[Grammage] [float] NULL,
[Date] [datetime] NOT NULL,
[IsActive] [bit] NOT NULL,
[IsDeleted] [bit] NOT NULL,
这是查询:
declare @Good1Scalar int
create table #Good1 (Id int)
insert into [Good] (Code, Title, GoodEnumId, Date, IsActive, IsDeleted)
output inserted.Id into #Good1
values (@Param2, @Param3, @Param4, @Param5, @Param6, @Param7)
SELECT @Good1Scalar = id from #Good1
drop table #Good1
insert into [PaperDetail](GoodId, Length, Width, Grammage, Date, IsActive, IsDeleted)
values (@Good1Scalar, @Param8, @Param9, @Param10, @Param11, @Param12, @Param13)
这是我的参数值和 DbType 对象(DynamicParameters 类型):
怎么了?
更新:
-
使用 SQL Server Profiler 我得到最终代码并在
SQL 服务器管理工作室直接。查询没有错误。因此,这个错误消息肯定会产生误导,问题出在其他地方。
为了测试,我删除了事务并且错误消失了。所以
我注意到问题出在交易上。这就是为什么我
回顾了之前接受此事务的方法(在一个方法中调用 QueryMultiple)。
我将 QueryMultiple 替换为 DataAdapter Fill 方法。最后,错误消失了。
【问题讨论】:
parameters
变量的类型是什么?请使用您声明并填写的代码更新您的问题。
尽快。
@CodeFuller 我添加了变量的类型信息。
也许参数 8-10 是整数,没有浮点数?这是整个查询吗?真的没有更多的参数在上面的某个地方声明了吗?
@Simons0n 您可以在屏幕截图中看到每个参数 DbTypes。
【参考方案1】:
从问题中仍然不清楚传递给 Dapper 的 ExecuteAsync
调用的 param
变量的类型是什么。传递参数的首选方式是通过DynamicParameters
bag。
这是适用于您的表定义和查询的代码。
DynamicParameters parameters = new DynamicParameters();
parameters.Add("Param2", "TheCode");
parameters.Add("Param3", "TheTitle");
parameters.Add("Param4", 4);
parameters.Add("Param5", "2018-01-28");
parameters.Add("Param6", true);
parameters.Add("Param7", false);
parameters.Add("Param8", 300);
parameters.Add("Param9", 30);
parameters.Add("Param10", 3);
parameters.Add("Param11", "2018-01-28");
parameters.Add("Param12", true);
parameters.Add("Param13", true);
var insertedId = await connection.ExecuteAsync(query, parameters, transaction);
试一试,应该可以的。
【讨论】:
params var 是一个 DynamicParameters 对象,就像你说的那样。 你可以在截图中看到每个参数值和SqlType。以上是关于Dapper ExecuteAsync 得到一个 SQLException:列名或提供的值的数量与表定义不匹配的主要内容,如果未能解决你的问题,请参考以下文章