4

我有一个具有以下定义的 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 代码,看起来 SQLite 检查值以将其映射到一组允许的类型。

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

4

1 回答 1

4

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 何时发布

于 2013-01-31T14:10:55.260 回答