如何在 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."