gpt4 book ai didi

c# - 字符串字段中的 sqlite 数值导致 InvalidCastException

转载 作者:太空狗 更新时间:2023-10-30 01:22:03 24 4
gpt4 key购买 nike

我有一个具有以下定义的 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) 放入 watch 时,它显示类型为“object {string}”。当我将该值更改为非数字值时,它工作正常。

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

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

最佳答案

对于 SqlDataReader.GetString 方法,不执行任何转换;因此,检索到的数据必须已经是字符串。

在调用此方法之前调用 IsDBNull 以检查空值。

将你的代码改成这样,它应该可以工作

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

关于c# - 字符串字段中的 sqlite 数值导致 InvalidCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627601/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com