Sqlite查询未返回预期值(值应<&1000;但不是)

时间:2013-11-19 15:06:15

标签: c# sqlite

技术是winforms,使用c#和sqlite作为我的数据库。我正在运行此查询:

   string sql6 = "select YYMM,  TotalTrans from t2 where cast(TotalTrans as Real) < 1000.00";

然后我从查询中获取结果并将它们填充到列表中,然后我用它来填充列表视图。

问题: TotalTrans列的结果显然大于1000,因为我得到了大量的数字甚至在100000s。

我试图修复它: 试图投两次,因为我认为由于某种原因TotalTrans列没有被转换为浮点数。

    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;但显然不是。当我尝试使用我的方法修复它时,我遇到另一个问题,即索引超出了数组的范围。什么是最好的解决方案?感谢

1 个答案:

答案 0 :(得分:2)

由于您正在进行转换,我将假设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>