"String or Binary Data Would be Truncated" 使用 Linq to SQL 时出错

"String or Binary Data Would be Truncated" Error when using Linq to SQL

我正在使用 Linq to SQL 将数据插入 table,但得到一个 SqlException 说 "String or binary data would be truncated"。但是,table 仅包含两个具有精确大小的 GUID;和一个 nvarchar(max),我的字符串少于 20 个字符。

我尝试使用 SqlCmd 手动插入行,效果很好。我还使用 SQL Profiler 验证了跟踪中没有任何内容,表明问题来自 Linq to SQL 框架。

table定义为:

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();

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

nvarchar(max) still being truncated

我还是不太明白这是怎么回事;看起来 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);

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

仍然想知道是什么导致了原始代码的异常...