使用Dapper查询时遇'String or binary data would be truncated'错误求助
执行Dapper查询时遇到SQL Server错误:String or binary data would be truncated,该错误通常出现在插入/更新数据超出字段长度时,但本次发生在SELECT场景,且实体类与数据库字段类型匹配。
关键问题排查与修复步骤
修正IN子句参数传递方式
当前代码中将多个MfgItemId拼接为字符串传入参数,这是错误的用法。Dapper支持直接传入IEnumerable类型参数,SQL会自动解析为多个参数,避免字符串拼接带来的问题:- 修改参数部分:
parameters: new { manufacturingItemId = measurementDetail // 直接传入IEnumerable<int>,无需拼接 } - 查询语句中的WHERE子句保持不变:
WHERE s.MfgItemId IN (@manufacturingItemId)
这种方式不仅更安全(防止SQL注入),还能避免因字符串参数导致的隐式转换问题,可能是触发截断错误的根源。
- 修改参数部分:
检查表上的触发器
若修正参数后仍报错,需检查查询涉及的Sample、SampleESIResult、QCProcessHistory表是否存在触发器(尤其是INSTEAD OF SELECT或AFTER SELECT触发器)。部分触发器可能在查询时执行插入/更新操作,导致数据截断。捕获实际执行的SQL语句
使用SQL Server Profiler或Extended Events捕获Dapper实际发送到数据库的SQL语句及参数值,直接在SSMS中执行该语句,确认是否仍触发错误。这有助于定位是否是参数传递或查询解析的问题。验证字段实际数据长度
确认SampleESIResult.PromassDirectoryPath字段的实际数据类型及长度,若该字段长度超过nvarchar(256),需同步调整实体类对应属性的处理逻辑(或数据库字段长度),避免映射时的隐式截断。
补充说明
直接在数据库执行查询正常,是因为手动替换参数时使用了正确的IN子句格式(如IN (1,2,3)),而代码中传入的是单个字符串参数(如IN ('1,2,3')),两者执行逻辑完全不同。
内容的提问来源于stack exchange,提问作者Steven

