【问题标题】:sqlite numeric value in string field causes InvalidCastException字符串字段中的 sqlite 数值导致 InvalidCastException
【发布时间】:2013-01-15 15:52:53
【问题描述】:

我有一个具有以下定义的 SQLite 表:

create table routes(id INTEGER PRIMARY KEY AUTOINCREMENT, name string)

并希望使用System.Data.SQLite 获取记录:

cmdRoute.CommandText = "SELECT id, name FROM routes";
using (var rdrRoute = cmdRoute.ExecuteReader())
{
    if(rdrRoute.Read())
    {
        var route = new Route();
        route.Id = rdrRoute.GetInt32(0);
        route.Name = rdrRoute.GetString(1); // Throws InvalidCastException
    }
}

当数据库中的值为数字时,GetString 会引发 InvalidCastException。 当我将rdrRoute.GetValue(1) 放入手表时,它显示类型为“object {string}”。当我将值更改为非数字值时,它可以正常工作。

我查看了SQLite DataReader code,看起来 SQLite 会检查该值以将其映射到一组允许的类型。

这是预期的行为吗?我该如何防止这种情况,以使包含数字的字符串仍然是字符串?

【问题讨论】:

  • Luuk 如果你试试这个route.Name = rdrRoute.GetString(1).ToString(); 或者尝试将它转换为这样的字符串route.Name = (string)rdrRoute.GetString(1);
  • rdrRoute.GetString(1) 已经因 InvalidCastException 而崩溃。
  • 您是否尝试过将其转换为字符串(string)rdrRoute.GetString(1);
  • (string)rdrRoute.GetValue(1) 有效,但我想知道为什么 GetString(1) 无效。
  • 我知道您为什么会出错,我也会将此添加到我的答案中,以提高可读性和解释性。

标签: c# sqlite .net


【解决方案1】:

for the SqlDataReader.GetString Method, No conversions are performed; therefore, the data retrieved must already be a string.

Call IsDBNull to check for null values before calling this method.

把你的代码改成这个,它应该可以工作

cmdRoute.CommandText = "SELECT id, name FROM routes";
using (var rdrRoute = cmdRoute.ExecuteReader())
{
    if(rdrRoute.Read())
    {
        var route = new Route();
        route.Id  = rdrRoute["id"];
        if (!rdrRoute.IsDBNull(rdrRoute.GetOrdinal("name")))
        {
           route.Name = rdrRoute["name"].ToString();
           //route.Name = rdrRoute.GetString(rdrRount.GetOrdinal("name"));
           //may not work in .Net 4.0
        }
    }
}

.NET 4.0 GetString() 可能会导致 .NET 4.0 中的错误/错误我会尝试将项目回滚到 3.5 版或创建一个使用代码示例的项目并将其创建为 .NET 3.5,如果这适用于GetString() 我发现 .net 4.0 中存在一些错误,我不确定 KB Fix 何时发布

【讨论】:

  • (string)rdrRoute.GetString(1) 因 InvalidCastException 而崩溃,并且 Id 是 Int32,所以我需要将其转换为 Convert.ToInt32(rdrRoute["id"])。 rdrRoute["name"].ToString(); 虽然有效。
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2020-03-20
  • 2011-07-23
相关资源
最近更新 更多