【问题标题】:String or binary data would be truncated.The statement has been terminated字符串或二进制数据将被截断。语句已终止
【发布时间】:2020-06-23 01:03:44
【问题描述】:

我正在使用 Entity Framework 中的 update-database 命令更新我的数据库,并引发错误消息:String or binary data would be truncated. The statement has been terminated

如何让更新生效?

【问题讨论】:

标签: entity-framework ef-code-first


【解决方案1】:

将此代码作为第一个实体:

public class Something
{
    public string SomeProperty { get; set; }
}

这将创建一个NVARCHAR(MAX) 类型的列,可以让您存储几乎任何大小的文本。

现在我们应用这样的注释:

public class Something
{
    [MaxLength(50)]
    public string SomeProperty { get; set; }
}

因此,现在从这里迁移必须缩短您的列,使其仅包含 50 个字符。如果您有超过 50 个字符的条目,您将收到该错误消息。

解决方案 1

修复数据!删除任何超过 50 个字符的数据。使用 SQL,或者删除有问题的行:

DELETE FROM MyTable
WHERE LEN(MyColumn) > 50

或者,也许更好的办法是手动截断数据:

UPDATE MyTable
SET MyColumn = LEFT(MyColumn, 50)
WHERE LEN(MyColumn) > 50

解决方案 2(不能 100% 确定这会起作用)

使用以下命令让迁移截断数据:

Update-Database -Force

【讨论】:

  • 使用-Force 标志不会覆盖截断错误。但是,运行UPDATE MyTable SET MyColumn = LEFT(MyColumn, 50) 确实允许Update-Database 命令成功完成。
  • VS2019。 -强制不起作用。我有一列 NVARCHAR(60) 并希望通过代码优先迁移将其设置为 NVARCHAR(6)。表中只有一个现有行,该列中有 10 个字符,而其余的都是 6 个,并且“Update-Database”引发了这个异常,无论有没有“-Force”。我刚刚使用 SQL Server 控制台修复了这一条目(减少到 6 个字符)并且更新数据库正常工作。
【解决方案2】:

这是一篇关于如何调试此问题或任何 EF 相关问题的文章:

String or binary data would be truncated. The statement has been terminated

基本上,您要做的就是打开“SQL Server Profiler”并打开“Exception”和“RPC:Starting”分析器。当您在分析器中收到错误时,您将能够看到 EF 执行的完整查询。您可以从那里复制并粘贴到 MS SQL Server Management Studio,手动运行它并找出问题。

【讨论】:

    【解决方案3】:

    在 EF dot net core“代码优先”中,可以执行以下 SQL 语句:

    UPDATE MyTable
    SET MyColumn = LEFT(MyColumn, 50)
    WHERE LEN(MyColumn) > 50
    

    在 Migration UP 部分,可以这样执行 sql:

    modelBuilder.sql("UPDATE MyTable SET MyColumn = LEFT(MyColumn, 50) WHERE LEN(MyColumn) > 50");
    

    请注意,该语句必须在更改字符串长度之前。

    【讨论】:

      【解决方案4】:

      对我来说,听起来您正试图将表中字段的长度/大小更改为“更小”,然后是已经存在于其中的某些数据。

      例如,如果我的表中有一个 varchar(28) 类型的字段字段——其中已经包含 28 个字符长的数据...然后我尝试执行一个更改表以将大小减小到 varchar (25) 它会说:字符串或二进制数据将被截断

      如果您试图将一个长度为 30 个字符的字符串填充到仅支持 28 个字符的字段中,也会出现这种情况......

      因此,如果您尝试将数据插入字段并且数据太大而无法基本适应,则可能会发生这种情况

      【讨论】:

      • 是的,我正在尝试将长度从 NVARCHAR(MAX) 更改为 nvarchar(60)、NVARCHAR(MAX) 更改为 nvarchar(30)、NVARCHAR(MAX) 更改为 nvarchar(5)。当我通过时包管理器控制台中的命令,添加迁移数据注释和更新数据库,出现此错误,请告诉我解决方案
      • 执行此 SQL 以查找列中数据的最大长度:SELECT name, LENGTH(name) AS mlen FROM mytable ORDER BY mlen DESC LIMIT 1
      • 更改表时使用最大长度值...否则您需要编写特殊的 DML SQL UPDATE 查询来显式截断数据
      • @user1500191 很确定LIMIT 1 在 SQL Server 中不可用,它是 MySQL 的东西,对吧?
      • sql-server: select max(len(Desc)) from table_name
      【解决方案5】:

      这是一个属性长度问题。您正在尝试插入长度小于您声明的属性长度的属性值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-31
        • 2018-03-28
        • 2013-03-19
        • 1970-01-01
        • 1970-01-01
        • 2012-11-03
        相关资源
        最近更新 更多