字符串或二进制数据将被截断. 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); } } } }