"字符串或二进制数据将被截断." linq异常,无法找到哪个字段超过了最大长度

Har*_*sha 16 linq-to-sql

字符串或二进制数据将被截断.linq异常,无法找到哪个字段超过了最大长度.

我有大约350个领域.我检查每个与数据库中的字段最大长度每一个文本框最大长度,一切似乎是正确的,但我仍然得到异常.

请帮忙

sha*_*tin 34

使用350个字段对此错误进行故障排除可能非常困难,并且在这种情况下SQL Server Profiler没有太大帮助(在生成的SQL中查找长字符串就像在大海捞针中查找针).

因此,这是一种自动查找超出数据库大小限制的实际字符串的方法.这是一种在互联网上以各种形式出现的解决方案.您可能不希望将其保留在生产代码中,因为属性/属性搜索非常低效,并且它会在每次保存时增加额外开销.当你遇到这个问题时我会把它扔进你的代码中,并在你完成后删除它.

它是如何工作的:它迭代你要保存的对象的所有属性,使用LINQ to SQL查找属性ColumnAttribute.然后,如果ColumnAttribute.DbType包含"varchar",您知道它是一个字符串,您可以解析该属性的该部分以找到最大长度.

以下是如何使用它:

foreach (object update in context.GetChangeSet().Updates)
{
    FindLongStrings(update);
}

foreach (object insert in context.GetChangeSet().Inserts)
{
    FindLongStrings(insert);
}

context.SubmitChanges();
Run Code Online (Sandbox Code Playgroud)

这是方法:

public static void FindLongStrings(object testObject)
{
    foreach (PropertyInfo propInfo in testObject.GetType().GetProperties())
    {
        foreach (ColumnAttribute attribute in propInfo.GetCustomAttributes(typeof(ColumnAttribute), true))
        {
            if (attribute.DbType.ToLower().Contains("varchar"))
            {
                string dbType = attribute.DbType.ToLower();
                int numberStartIndex = dbType.IndexOf("varchar(") + 8;
                int numberEndIndex = dbType.IndexOf(")", numberStartIndex);
                string lengthString = dbType.Substring(numberStartIndex, (numberEndIndex - numberStartIndex));
                int maxLength = 0;
                int.TryParse(lengthString, out maxLength);

                string currentValue = (string)propInfo.GetValue(testObject, null);

                if (!string.IsNullOrEmpty(currentValue) && maxLength != 0 && currentValue.Length > maxLength)
                    Console.WriteLine(testObject.GetType().Name + "." + propInfo.Name + " " + currentValue + " Max: " + maxLength);

            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 4年的信,仍然真的很有帮助.谢谢! (3认同)