【发布时间】: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)无效。 -
我知道您为什么会出错,我也会将此添加到我的答案中,以提高可读性和解释性。