【问题标题】:String Or Binary Data Would Be Truncated - Column is Big Enough字符串或二进制数据将被截断 - 列足够大
【发布时间】:2016-01-11 18:17:48
【问题描述】:

我有一个令人困惑的问题。我有一个使用本地 SQL Server 数据库的 WPF 应用程序。我正在使用实体框架。我正在尝试将长度为 120 的字节数组存储到 BINARY(120) 列中。

数据应该适合,但由于某种原因,我不断收到错误消息,“字符串或二进制数据将被截断”。

表结构如下:

Column_name   Type        Computed   Length

Id            int         no         4
Foo           varchar     no         500
Bar           binary      no         120

作为一项实验,我尝试将列更改为 VARBINARY(MAX) 列,但即使在这种情况下,我仍然会遇到相同的错误。这通常表明另一列可能导致问题,但是我知道问题不是 Id 列,我存储到 Foo 中的字符串是“测试字符串”,这显然足够小。

插入数据库的方法没有做任何特别的事情:

public void Create(FooEntry entry)
{
    _context.FooEntries.Add(entry);
    _context.SaveChanges();
}

也许我遗漏了一些非常明显的东西,但我应该如何解决这个问题?

更新:

是的,我很确定 EDMX 和数据库表是同步的(因为当我更新数据库表时,我总是刷新 edmx)。

我尝试手动将长度为 120 的字节数组插入到表中,但没有收到错误。当我手动插入长度为 121 的字节数组时,出现“字符串或二进制数据将被截断”错误,这是正确的行为。

我在调试程序时尝试插入的字节数组是这个值:

 '0x2400320061002400310030002400510078004400310072003400390079004C006D0041004A00760049004E005700730069007900490058004F007400740052007600500031006900700078004C0044007000610032004900350038007700310059002E0071003300680033004B0064002F00430074005700'

这是一个长度为 120 的字节数组。

更新 2:

我运行了 SQL Server Profiler,它给了我以下 SQL 查询:

exec sp_executesql N'INSERT [dbo].[FooEntry]([Foo], [Bar])
VALUES (@0, @1)
SELECT [Id]
FROM [dbo].[FooEntry]
WHERE @@ROWCOUNT > 0 AND [Id] = scope_identity()',N'@0 varchar(500),@1 binary(120)',@0='test string',@1=0x24003200610024003100300024004100420047007400560056006A0076004D006F006500770036005000300054004D002F006B007800740075007A00490036004F004400660047004A0062004E0069004E00790041007A0051006A0058004300660072007400360051007A0043004B004400580075006500

很奇怪。此查询在我手动执行时有效,但在程序运行时执行此查询时,EF 会引发错误。

【问题讨论】:

  • 这是实体框架吗?
  • 是的,我会相应地编辑问题
  • 澄清一下,您的 ID 为 2,147,483,647 或更少,您的 Foo 是“测试字符串”,您的 Bar 是长度为 120 的字节数组?
  • 您的 EF 是如何配置的,EDMX 还是 Fluent/代码优先?我们可以看到映射配置吗?
  • 尝试在 SQL Server 中手动插入数据。它可能会帮助您跟踪问题。

标签: c# sql-server entity-framework


【解决方案1】:

我终于想通了,答案很可笑。

我的项目目录中有两个数据库,DatabaseA 和 DatabaseB,它们具有相同的架构。实体框架正在对 DatabaseA 运行查询,但是我的 EDMX 指向 DatabaseB,而在我的服务器资源管理器中显示的数据库是 DatabaseB。

这个问题可能发生在我修复之前的一个问题时,该问题导致我的本地 SQL Server 数据库数据被每次构建覆盖。

对于遇到此问题的任何人,我的建议是确保您的解决方案中的 app.config 文件都具有指向同一数据库的连接字符串。我解决这个问题的方法是更新我的数据层中的连接字符串:

1) 我删除了 app.config 文件中的连接字符串

2) 在我的 EDMX 设计器中,我删除了我的 FooEntry 表,然后右键单击并选择“从数据库更新模型”。然后弹出一个对话框,允许我创建一个新的连接字符串。通过此对话框,您可以浏览正确的数据库,Visual Studio 将为您创建正确的连接字符串。

【讨论】:

    猜你喜欢
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2010-10-21
    相关资源
    最近更新 更多