【问题标题】:C# - InvalidCastException when fetching double from sqliteC# - 从 sqlite 获取双精度时出现 InvalidCastException
【发布时间】:2023-04-10 13:00:01
【问题描述】:

当我在 C# 中从我的 SQLite 数据库中获取任何双精度时,我不断收到 InvalidCastException。异常说“指定的演员表无效。”

我能够在 SQL 管理器中看到该值,因此我知道它存在。可以从数据库中获取字符串 (VARCHARS) 和整数。我也可以将值作为对象获取,但是当它假定为“66,8558604947586”(纬度坐标)时,我得到“66.0”。

谁知道怎么解决这个问题?

我的代码:

using System.Data.SQLite;

...

SQLiteConnection conn = new SQLiteConnection(@"Data Source=C:\\database.sqlite;    Version=3;");
conn.Open();
SQLiteDataReader reader = getReader(conn, "SELECT * FROM table");

//These are working 
String name = reader.GetString(1);
Int32 value = reader.GetInt32(2);

//This is not working
Double latitude = reader.getDouble(3);

//This gives me wrong value
Object o = reader[3]; //or reader["latitude"] or reader.getValue(3)

【问题讨论】:

  • reader.GetFieldType(3) 返回什么?
  • 我的猜测是异常来自 GetDouble 方法内部。但是,我没有那个 SQLite 库,也无法检查它。你能做一个Double.Parse(reader.GetString(3));
  • 这似乎有效!这样做很烦人,但比例外更好。谢谢!
  • 我猜你可能在数据库和运行代码的客户端上有不同的语言环境?
  • 如何检查我的数据库的语言环境?

标签: c# .net sql sqlite


【解决方案1】:

您可能需要检查用于在数据库中存储值的数据类型。看起来您可能正在存储一个整数,但试图将其检索为双精度数。

【讨论】:

  • 它存储为双精度值,SQLite 管理器能够获取整个值。
【解决方案2】:

实际表 schema 是否定义为使用 DOUBLE? SQLite 将执行some translation,因为数据库引擎是无类型的。如果它实际上是 SQL DOUBLE 列,您也可以尝试强制转换。

More information on SQLite type affinity.

【讨论】:

  • 我按照 Jacob 的建议尝试了“reader.GetFieldType(3)”,它返回它被定义为 Double。 “也试试演员表”是什么意思?
  • 我的意思是添加一个 SQL 强制转换为 double,只是为了确保它是正确的类型。但是,如果 GetFieldType 确实返回 double,那么 SQL 转换将无济于事。
猜你喜欢
  • 2013-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
相关资源
最近更新 更多