为什么sqlite会转换。致,

时间:2016-07-28 12:31:31

标签: c# sqlite

我现在对SQLite感到困惑。 我使用C#

的System.Data.SQLite版本

我有两张桌子:

表1: 在其中我创建了两列(更多但在这种情况下它们是重要的,并且声明是很长的发布方式)。第一个叫做RecStat,第二个叫做DOXinM。 两者都是十进制,并且像这样创建: ...

[RectStat] Decimal,
[DOXinM] Decimal,

...

Create Table语句如下所示:

Create Table If Not Exists "Table1"
(..Columns..);

当我在这个表中插入一个值时,十进制工作完全正常,当我读出它时,它也适用于xaml GUI。

之后我创建了第二个表,它也有一个十进制列。 我以同样的方式创建了表(这是一个简短的表,所以我可以给出整个声明)

Create Table If Not Exists "Table2" (
 [ID] Integer Not Null Primary Key,
 [Material] VarChar(10],
 [Thickness] Decimal);

C#创建代码(请注意,我使用所有SQL命令的const字符串):

mySQLiteCommand.CommandText = @"" + DatabasePara.CREATE_SQL + " " + DatabasePara.TABLE_SQL + " " + DatabasePara.IF_SQL + " " + DatabasePara.NOT_SQL + " " + DatabasePara.EXISTS_SQL + " " + DBTableFilter.Filter + "     
mySQLiteCommand.CommandText += @"([" + DBTableFilter.ID + "] " + DatabasePara.INTEGER_SQL + " " + DatabasePara.NOT_SQL + " " + DatabasePara.NULL_SQL + " " + DatabasePara.PRIMARYKEY_SQL + ", ";
mySQLiteCommand.CommandText += @"[" + DBTableFilter.Material + "] " + DatabasePara.VARCHAR_SQL + "(360), ";
mySQLiteCommand.CommandText += @"[" + DBTableFilter.Thickness + "] " + DatabasePara.DECIMAL_SQL + ");";
mySQLiteCommand.ExecuteNonQuery();

在这两种情况下,我都为十进制列执行相同的插入:

Insert into Table1 ('RectStat') values ('10.5');
Insert into Table1 ('DOXinM') values ('1.3');


Insert into Table2 ('Thickness') values ('0.25');

对于Table2 Insert:

for (int FilterIndex = 0; FilterIndex < Database.FilterTable.FilterList.Count; FilterIndex++)
         {
           mySQLiteCommand.CommandText = @"" + DatabasePara.INSERTINTO_SQL + " " + DBTableFilter.Filter + "(" + DBTableFilter.Material + ", " + DBTableFilter.Thickness + ") ";
           mySQLiteCommand.CommandText += @"" + DatabasePara.VALUES_SQL + " ('" + Database.FilterTable.GetFilterAt(FilterIndex).Material_Property + "', " + Database.FilterTable.GetFilterAt(FilterIndex).Thickness_Property + ");";
           mySQLiteCommand.ExecuteNonQuery();
          }

现在,数据库将前两个语句作为10.5 / 1.3插入,最后一个作为0,25 当我读出这个值时,前两个工作完全正常,但最后一个显示没有小数点后的数字&#34;指向&#34;。

所以我的问题是。 为什么会这样? (顺便说一句,我的表中有超过20个小数列,而#34;厚度&#34;是唯一一个有此问题的列)

我希望你能帮助我。

先谢谢 理查德

我尝试过:

尝试了不同的价值观(希望是因为0.25) 没有&#39;尝试它。但是声明认为它有两个列的三个值......

1 个答案:

答案 0 :(得分:2)

首先,您应该使用参数化查询。他们将摆脱转换问题,并防止SQL注入。很可能您的问题是由您的查询创建类型隐式调用decimal.ToString()这一事实创建的。对于某些区域设置,这会将.替换为,,从而导致语法错误。

 var query = "INSERT INTO yourtable COLUMNS(col1, col2, col3) VALUES(@p1, @p2, @p3)";
 var cmd = new SQLiteCommand(query, connection);
 cmd.Parameters.AddWithValue("@p1", 1);
 cmd.Parameters.AddWithValue("@p2", 2.2);
 cmd.Parameters.AddWithValue("@p3", "three");
 cmd.ExecuteNonQuery();

除其他外,这将以正确的格式将小数发送到您的服务器,并在您的字符串文字中处理可能的'引号并防止sql注入,从而使您的代码更安全。< / p>