如何在 DataReader.GetString() 上修复 System.InvalidCastException
How to fix System.InvalidCastException on DataReader.GetString()
问题是:我 运行 此代码(代码 1),然后在浏览器中获得 System.InvalidCastException(ASP.NET)。完全相同的代码(在我的例子中,我使用我另一个项目中的这个函数),运行在另一个项目中使用相同的数据工作正常,不会抛出任何异常。
我试图捕获这个异常并查看问题对象(CODE 2)的内部,但令我惊讶的是没有捕获到异常(我在捕获代码块的第二行放置了一个断点以确保)我在浏览器中得到了正确的输出
代码 1
private static List<Dictionary<string, object>> GetResultRows(SQLiteDataReader Reader)
{
List<Dictionary<string, object>> Result = new List<Dictionary<string, object>>();
if (!Reader.HasRows) return Result;
while (Reader.Read())
{
var CurrentRow = new Dictionary<string, object>();
Result.Add(CurrentRow);
for (int i = 0; i < Reader.FieldCount; i++)
{
CurrentRow.Add(Reader.GetName(i), Reader.GetString(i));
}
}
return Result;
}
代码 2
private static List<Dictionary<string, object>> GetResultRows(SQLiteDataReader Reader)
{
List<Dictionary<string, object>> Result = new List<Dictionary<string, object>>();
if (!Reader.HasRows) return Result;
while (Reader.Read())
{
var CurrentRow = new Dictionary<string, object>();
Result.Add(CurrentRow);
for (int i = 0; i < Reader.FieldCount; i++)
{
//CurrentRow.Add(Reader.GetName(i), Reader.GetString(i));
try
{
CurrentRow.Add(Reader.GetName(i), Reader.GetString(i));
}
catch
{
var temp = Reader.GetValue(i);
System.Diagnostics.Debug.WriteLine($"{Reader.GetName(i)} = {Reader.GetValue(i)}");
}
}
}
return Result;
}
我希望这个函数尽可能快,所以try-catch不能解决我的问题。有什么想法吗?
UPD:浏览器异常:image
我认为基本的答案是Reader.GetString(i)
如果值为null
就会抛出异常,所以你必须使用IsDBNull
来检查。如需了解更多信息,请参阅此处:
SQL Data Reader - handling Null column values
Reader.GetString() 与 object.ToString() 不同。
image
UPD:从评论到 C Perkins 评论:"It appears because of SQLiteDataReader checking the column data type of returned from db file data set. For example: if column data type is integer and we run GetString() method, SQLiteDataReader throw exception."
问题是:我 运行 此代码(代码 1),然后在浏览器中获得 System.InvalidCastException(ASP.NET)。完全相同的代码(在我的例子中,我使用我另一个项目中的这个函数),运行在另一个项目中使用相同的数据工作正常,不会抛出任何异常。
我试图捕获这个异常并查看问题对象(CODE 2)的内部,但令我惊讶的是没有捕获到异常(我在捕获代码块的第二行放置了一个断点以确保)我在浏览器中得到了正确的输出
代码 1
private static List<Dictionary<string, object>> GetResultRows(SQLiteDataReader Reader)
{
List<Dictionary<string, object>> Result = new List<Dictionary<string, object>>();
if (!Reader.HasRows) return Result;
while (Reader.Read())
{
var CurrentRow = new Dictionary<string, object>();
Result.Add(CurrentRow);
for (int i = 0; i < Reader.FieldCount; i++)
{
CurrentRow.Add(Reader.GetName(i), Reader.GetString(i));
}
}
return Result;
}
代码 2
private static List<Dictionary<string, object>> GetResultRows(SQLiteDataReader Reader)
{
List<Dictionary<string, object>> Result = new List<Dictionary<string, object>>();
if (!Reader.HasRows) return Result;
while (Reader.Read())
{
var CurrentRow = new Dictionary<string, object>();
Result.Add(CurrentRow);
for (int i = 0; i < Reader.FieldCount; i++)
{
//CurrentRow.Add(Reader.GetName(i), Reader.GetString(i));
try
{
CurrentRow.Add(Reader.GetName(i), Reader.GetString(i));
}
catch
{
var temp = Reader.GetValue(i);
System.Diagnostics.Debug.WriteLine($"{Reader.GetName(i)} = {Reader.GetValue(i)}");
}
}
}
return Result;
}
我希望这个函数尽可能快,所以try-catch不能解决我的问题。有什么想法吗?
UPD:浏览器异常:image
我认为基本的答案是Reader.GetString(i)
如果值为null
就会抛出异常,所以你必须使用IsDBNull
来检查。如需了解更多信息,请参阅此处:
SQL Data Reader - handling Null column values
Reader.GetString() 与 object.ToString() 不同。 image
UPD:从评论到 C Perkins 评论:"It appears because of SQLiteDataReader checking the column data type of returned from db file data set. For example: if column data type is integer and we run GetString() method, SQLiteDataReader throw exception."