linq-to-sql – “字符串或二进制数据将被截断”.linq异常,找不到哪个字段超过最大长度

前端之家收集整理的这篇文章主要介绍了linq-to-sql – “字符串或二进制数据将被截断”.linq异常,找不到哪个字段超过最大长度前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
字符串或二进制数据将被截断. linq异常,找不到哪个字段超过最大长度.

我有350个字段.我检查每个文本框maxlength与数据库字段maxlength,一切似乎是正确的,但我仍然得到异常.

请帮忙

解决方法

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

这里的方法是:

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

            }
        }
    }
}

猜你在找的MsSQL相关文章