使用 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();
我发现这是一个关于 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);
这有效(不仅适用于测试字符串,也适用于实际数据)。
仍然很好奇是什么导致了原始代码的异常......