【发布时间】:2021-07-11 03:39:26
【问题描述】:
我正在尝试获取具有 REAL 类型的特定列的值,并希望将其保存在 double 或 float 中。 p>
问题是,到目前为止,我尝试的所有操作要么只返回一个整数,要么返回一个错误:指定的转换无效。例如,如果数据库中的值为 1,99,我会得到 1。调试器说它仍然是 double 类型。
我尝试过的:
public static void GetDouble()
{
SQLiteConnection databaseConnection = new SQLiteConnection($"Data Source=.\\val.sqlite;Version=3;");
SQLiteCommand sqlCommand = databaseConnection.CreateCommand();
sqlCommand.CommandText = $"SELECT * FROM doubles";
databaseConnection.Open();
SQLiteDataReader sqlReader = sqlCommand.ExecuteReader();
while (sqlReader.Read())
{
// expected values: 1,1 | 8,66 | 0,64 | 0,82 | 1,9 | 0,89 | 0,52 | 1,35 | 4,32 | 1,66
double nbr = (double)System.Convert.ToDouble(sqlReader["KDRatio"]); // gives me: 1 | 8 | 0 | 0 | 1 | 0 | 0 | 1 | 4 | 1
// double nbr = sqlReader.GetDouble(sqlReader.GetOrdinal("KDRatio")); // specified cast is not valid
// double nbr = sqlReader.GetDouble(5); // specified cast is not valid
// double nbr = (double)sqlReader["KDRatio"]; // gives me: 1 | 8 | 0 | 0 | 1 | 0 | 0 | 1 | 4 | 1
// float nbr = (float)sqlReader["KDRatio"]; // specified cast is not valid
// float nbr = (float)System.Convert.ToDouble(sqlReader["KDRatio"]); // gives me: 1 | 8 | 0 | 0 | 1 | 0 | 0 | 1 | 4 | 1
// string nbr = ((double)sqlReader.GetDouble(5)).ToString("#,#", CultureInfo.InvariantCulture); // specified cast is not valid
System.Console.WriteLine(nbr);
}
databaseConnection.Close();
}
我实际上尝试了更多组合,但都没有奏效。 我期待
double nbr = (double)System.Convert.ToDouble(sqlReader["KDRatio"]);
工作,因为在其他方法中我收到不同的值就好了,例如
Name = sqlReader["Name"].ToString()
OnlineTimeMinutes = System.Convert.ToInt32(sqlReader["OnlineTimeMinutes"])
但双打似乎给我带来了很多麻烦。
那么我怎样才能得到两位小数的正确值呢?
【问题讨论】:
-
我认为您遇到了小数点中逗号而不是句点的文化问题。在使用 System.Convert.ToDouble 转换字符串之前,您是否尝试将逗号替换为句点?
System.Convert.ToDouble(sqlReader["KDRatio"].Replace(",","."))之类的东西? -
值
sqlReader["KDRatio"].GetType().Name的实际数据类型是什么? -
@TamBui 刚刚试过,但又只给了我一个整数
-
@Charlieface 是双份的。
-
你能分享异常“Specified cast not valid”的堆栈跟踪吗?你怎么知道来自
(double)sqlReader["KDRatio"]的结果是错误的,你真的用另一种方式检查过数据库吗?
标签: c# sqlite double sqldatareader