C# 什么.Net数据类型可以触发类型为';的无法强制转换对象';输入';System.String';

C# 什么.Net数据类型可以触发类型为';的无法强制转换对象';输入';System.String';,c#,sql-server,C#,Sql Server,我手上有一个.Net迷 我们收到了以下堆栈跟踪 ---> System.InvalidCastException: Unable to cast object of type '' to type 'System.String'. at System.Data.DataColumn.IsMaxLengthViolated() at System.Data.DataTable.EnableConstraints() at System.Data.DataTable.EndL

我手上有一个.Net迷

我们收到了以下堆栈跟踪

---> System.InvalidCastException: Unable to cast object of type '' to type 'System.String'.
   at System.Data.DataColumn.IsMaxLengthViolated()
   at System.Data.DataTable.EnableConstraints()
   at System.Data.DataTable.EndLoadData()
   at System.Data.Common.DataAdapter.FillFromReader(DataSet dataset, DataTable datatable, String srcTable, DataReaderContainer dataReader, Int32 startRecord, Int32 maxRecords, DataColumn parentChapterColumn, Object parentChapterValue)
   at System.Data.Common.DataAdapter.Fill(DataTable[] dataTables, IDataReader dataReader, Int32 startRecord, Int32 maxRecords)
   at System.Data.DataTable.Load(IDataReader reader, LoadOption loadOption, FillErrorEventHandler errorHandler)
触发此错误的MSSQL数据库表仅包含不同长度的ints和可为空的nvarchar列

该表包含DBNulls和字符串值

无论我们尝试什么,都无法触发InvalidCastException,其中第一个类型的名称显示为空字符串“” 我们尝试了db查询可能返回的每种类型

  • DBNull
  • int
  • 智力
  • SqlString
我们总是在InvalidCastException中收到正确的类型名称

我们反编译了IsMaxLengthVillected代码,怀疑它使用格式错误的消息构造了自己的InvalidCasetException,但只找到了正常的强制转换

if (obj != null && obj != DBNull.Value && ((string) obj).Length > this.MaxLength)
此消息似乎是由.Net framework生成的

是否有任何已知的方法可以触发我们缺少的格式错误的InvalidCastException?

替换此

if (obj != null && obj != DBNull.Value && ((string) obj).Length > this.MaxLength)

更新

此问题已发布,请访问以下链接:

上面链接中给出的答案是使用obj执行toString,但最佳实践是Convert.toString()来处理null异常


我希望这能解决您的问题。

如果您已经考虑过,我很抱歉,但在我看来,这似乎是试图将字符转换为字符串。您有访问数据库的权限吗?因为显然是datatable中的一个值,.Net无法转换为字符串,也无法确定其类型。也许如果你研究所有的价值观,你会发现哪一个是正确的。不管怎样,这段代码真的很奇怪。我认为OP不想修改任何链接。您能告诉我如何在.Net Framework源代码中更改它吗?这个问题不能与DBNull相关,因为InvalidCastException将包括InvalidCast中的from类型为'System.DBNull',并且if语句包括针对DBNull的保护。不知何故,我们从数据读取器接收到一个没有类型名的对象。我们正在努力弄清楚这是怎么发生的。
if (obj != null && obj != DBNull.Value && (Convert.ToString(obj)).Length > this.MaxLength)