技术是winforms,使用c#和sqlite作为我的数据库。我正在运行此查询:
string sql6 = "select YYMM, TotalTrans from t2 where cast(TotalTrans as Real) < 1000.00";
然后,我从查询中获取结果并将其填充到列表中,然后使用它们填充列表视图。
问题:
TotalTrans列的结果似乎明显大于1000,因为我得到的数字很多,甚至是100000s。
我试图解决的问题:
尝试进行两次转换,因为我出于某种原因认为TotalTrans列未转换为float。
string sql6 = "select YYMM, cast(TotalTrans as Real) from t2 where cast(TotalTrans as Real) < 1000.00";
但是,这只会使情况变得更糟,因为我遇到了另一个问题:以下代码(位于“ reader3 [“ TotalTrans”]部分中的“索引超出了数组的范围”)。
string sql6 = "select YYMM, cast(TotalTrans as Real) from t2 where cast(TotalTrans as Real) < 1000.00";
SQLiteCommand command3 = new SQLiteCommand(sql6, sqlite_conn);
SQLiteDataReader reader3 = command3.ExecuteReader();
while (reader3.Read())
{
double TotalTrans;
DateTime yyyymm;
if (DateTime.TryParse(reader3["YYMM"].ToString(), out yyyymm) && double.TryParse(reader3["TotalTrans"].ToString(), out TotalTrans))
{
YYMM.Add(yyyymm);
TotalTransIrregularities.Add(TotalTrans);
}
}
注意:
这是一个附带问题,但主要问题是我发布的原始问题。查询应返回小于1000的值,但显然不是。当我尝试使用自己的方法修复它时,我遇到了另一个问题,即索引超出了数组的范围。最好的解决方法是什么?谢谢
最佳答案
既然要进行转换,我将假设TotalTrans是一个文本列,并且数据中以逗号作为千位分隔符。由于SQLite似乎会将其解释为小数,因此您需要在转换前删除逗号。
select YYMM, TotalTrans from t2 where cast(replace(TotalTrans, ',', '') as Real) < 1000.00
从select语句中删除转换将使您从数据库中获得值
10,000
,但这是可以的,因为double.TryParse(...)
将按预期解释逗号(假设您的本地化设置将逗号指定为千位分隔符...)。下面是我对SQLite命令行的实验:
sqlite> create table test2 (value nvarchar(30));
sqlite> insert into test2 (value) values ('10,000');
sqlite> insert into test2 (value) values ('100');
sqlite> insert into test2 (value) values ('15,000');
sqlite> select * from test2;
10,000
100
15,000
sqlite> select cast(value as real) from test2;
10.0
100.0
15.0
sqlite> select cast(replace(value,',','') as real) from test2;
10000.0
100.0
15000.0
sqlite>