C# C SQLite vs DataTable:'指定的强制转换无效。'
我在从DataTable行获取值时遇到问题 以下是查询:C# C SQLite vs DataTable:'指定的强制转换无效。',c#,sqlite,C#,Sqlite,我在从DataTable行获取值时遇到问题 以下是查询: SELECT COALESCE((FE1), 0) + COALESCE((FE2), 0) + COALESCE((FEE), 0) FROM DRC WHERE DTS = '2021-04-21T09:57:47+02:00' 在DB Browser中,它返回以下值:-5700 使用不同的时间戳,它也可能会产生2位小数的值,因此我决定在从DataTable检索时将其转换为十进制 但是下面的代码抛出了一个错误 指定的强制转换无效
SELECT COALESCE((FE1), 0) + COALESCE((FE2), 0) + COALESCE((FEE), 0)
FROM DRC
WHERE DTS = '2021-04-21T09:57:47+02:00'
在DB Browser中,它返回以下值:-5700
使用不同的时间戳,它也可能会产生2位小数的值,因此我决定在从DataTable检索时将其转换为十进制
但是下面的代码抛出了一个错误
指定的强制转换无效
例如,integer、double等类型的结果是相同的。这是因为您正在执行原始读取,因此DataTable中的返回值将按照基础ORM选择的方式进行类型化,在这种情况下,可能是SQLiteDecimal结构或类似结构 我不明白为什么要使用DataTable,因为您正在读取单个resultset的一行。只需直接使用SQLiteDataReader:
using (var cmd = new SQLiteCommand(query, con))
{
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
sum = reader.GetDecimal(0);
}
}
}
调试并检查DataTable中返回的数据类型。此外,我从未见过这种从数据表读取数据的方式。您可能应该尝试使用sum+=Convert.ToDecimalrow[0]的标准方法;Field方法没有任何问题—它只是提供了一种访问列值的方便方法—请参阅
using (var cmd = new SQLiteCommand(query, con))
{
using (var reader = cmd.ExecuteReader())
{
if (reader.Read())
{
sum = reader.GetDecimal(0);
}
}
}