使用 Linq to SQL 时出现“字符串或二进制数据将被截断”错误

本文关键字:数据 二进制 错误 字符串 SQL to Linq 使用 | 更新日期: 2023-09-27 18:31:41

我正在使用Linq to SQL将数据插入表中,但得到一个SqlException,说"字符串或二进制数据将被截断"。但是,该表仅包含两个具有确切大小的 GUID;和一个 nvarchar(max),我的字符串少于 20 个字符。

我尝试使用 SqlCmd 手动插入行,这工作正常。我还使用 SQL Profiler 验证了跟踪中没有写入任何内容,表明问题来自 Linq to SQL 框架。

表定义为:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Results](
    [GroupID] [uniqueidentifier] NOT NULL,
    [ItemID] [uniqueidentifier] NOT NULL,
    [Name] [nvarchar](max) NOT NULL,
    PRIMARY KEY (GroupID, ItemID)
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO

Linq 到 SQL 的映射(来自 DBML 文件)是:

<Table Name="dbo.Results" Member="Results">
  <Type Name="Result">
    <Column Name="GroupID" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
    <Column Name="ItemID" Type="System.Guid" DbType="UniqueIdentifier NOT NULL" IsPrimaryKey="true" CanBeNull="false" />
    <Column Name="Name" Type="System.String" DbType="NVarChar(MAX) NOT NULL" CanBeNull="false" />
  </Type>
</Table>

在我的 C# 代码中,这给出了异常:

db.Results.InsertOnSubmit(new Result
{
    GroupID = Guid.NewGuid(),
    ItemID = Guid.NewGuid(),
    Name = "test"
});
db.SubmitChanges();

使用 Linq to SQL 时出现“字符串或二进制数据将被截断”错误

我发现这是一个关于 nvarchar(max) 被截断的问题。也许这个问题的答案会解决你的问题。这可能是误解,但我希望它有所帮助。这是一个不同的问题,但两者都是关于 nvarchar(max) 被截断,所以......

nvarchar(max) 仍然被截断

我仍然不明白这里到底发生了什么;看起来像一个糟糕的 Linq 到 SQL 映射,或者(不太可能)框架中的一个错误。

但是为了解决这个问题,我替换了:

db.Results.InsertOnSubmit(new Result
{
    GroupID = Guid.NewGuid(),
    ItemID = Guid.NewGuid(),
    Name = "test"
});
db.SubmitChanges();

跟:

string cmd = string.Format("insert into Results values('{0}', '{1}', '{2}')", Guid.NewGuid(), Guid.NewGuid(), "test")
db.ExecuteCommand(cmd);

这有效(不仅适用于测试字符串,也适用于实际数据)。

仍然很好奇是什么导致了原始代码的异常......