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 变量的类型是什么。传递参数的首选方式是通过DynamicParametersbag。

这是适用于您的表定义和查询的代码。

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:列名或提供的值的数量与表定义不匹配的主要内容,如果未能解决你的问题,请参考以下文章

在事务中使用 dapper async

Dapper where Id in的解决方案

如何在 Windows 服务中实现啥都不做 ExecuteAsync?

插入,更新或删除记录时返回记录的ID

Dapper.NET 怎么得到 DataTable

MSAL AcquireTokenWithDeviceCode ExecuteAsync 挂起