我现在对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;尝试它。但是声明认为它有两个列的三个值......
答案 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>