![](/img/trans.png)
[英]InvalidCastException when using datareader.getString() on a string field that contains numerical value
[英]sqlite numeric value in string field causes InvalidCastException
我有一个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会检查该值以将其映射到一组允许的类型。
这是预期的行为,我如何防止这种情况,包含数字的字符串仍然是字符串?
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何时发布
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.