字符串或二进制数据将被截断.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)
| 归档时间: |
|
| 查看次数: |
8389 次 |
| 最近记录: |