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

使用Dapper查询时遇'String or binary data would be truncated'错误求助

解决Dapper查询时抛出'String or binary data would be truncated'错误

执行Dapper查询时遇到SQL Server错误:String or binary data would be truncated,该错误通常出现在插入/更新数据超出字段长度时,但本次发生在SELECT场景,且实体类与数据库字段类型匹配。

关键问题排查与修复步骤

  1. 修正IN子句参数传递方式
    当前代码中将多个MfgItemId拼接为字符串传入参数,这是错误的用法。Dapper支持直接传入IEnumerable类型参数,SQL会自动解析为多个参数,避免字符串拼接带来的问题:

    • 修改参数部分:
      parameters: new
      {
          manufacturingItemId = measurementDetail // 直接传入IEnumerable<int>,无需拼接
      }
      
    • 查询语句中的WHERE子句保持不变:WHERE s.MfgItemId IN (@manufacturingItemId)
      这种方式不仅更安全(防止SQL注入),还能避免因字符串参数导致的隐式转换问题,可能是触发截断错误的根源。
  2. 检查表上的触发器
    若修正参数后仍报错,需检查查询涉及的Sample、SampleESIResult、QCProcessHistory表是否存在触发器(尤其是INSTEAD OF SELECT或AFTER SELECT触发器)。部分触发器可能在查询时执行插入/更新操作,导致数据截断。

  3. 捕获实际执行的SQL语句
    使用SQL Server Profiler或Extended Events捕获Dapper实际发送到数据库的SQL语句及参数值,直接在SSMS中执行该语句,确认是否仍触发错误。这有助于定位是否是参数传递或查询解析的问题。

  4. 验证字段实际数据长度
    确认SampleESIResult.PromassDirectoryPath字段的实际数据类型及长度,若该字段长度超过nvarchar(256),需同步调整实体类对应属性的处理逻辑(或数据库字段长度),避免映射时的隐式截断。

补充说明

直接在数据库执行查询正常,是因为手动替换参数时使用了正确的IN子句格式(如IN (1,2,3)),而代码中传入的是单个字符串参数(如IN ('1,2,3')),两者执行逻辑完全不同。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:44:52