【问题标题】:Why does sqlite converts . To ,为什么 sqlite 会转换 .到 ,
【发布时间】:2016-12-02 20:25:59
【问题描述】:

我现在完全被 SQLite 搞糊涂了。 我使用 C# 的 System.Data.SQLite 版本

我有两个表:

表 1: 在其中,我创建了两列(更多,但在这种情况下它们很重要,并且该语句很长才能发布)。第一个称为 RecStat,第二个称为 DOXinM。 两者都是 Decimal 并且是这样创建的: ...

[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 插入:

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 当我读出值时,前两个工作得很好,但最后一个显示没有小数点“点”后的数字。

所以我的问题是。 为什么会发生这种情况? (顺便说一句,我的表中有 20 多个小数列,而“厚度”是唯一存在此问题的列)

我希望你能帮助我。

提前致谢 理查德

我尝试过的:

尝试了不同的值(希望是因为 0.25) 在没有''的情况下尝试过。但比声明认为它有两列的三个值...

【问题讨论】:

  • id 猜测是因为它使用的默认语言设置。
  • 我在哪里可以找到它们?为什么会有不同的行为?
  • @derpirscher 我为问题表添加了 C# 代码
  • @BugFinder 我的问题(遗憾的是)与您的链接中的问题不完全相同。我的问题是 ot 20 小数只有一个不起作用。我使用所有插入语句的参数。 (也许我错过了你的重点)

标签: c# sqlite


【解决方案1】:

首先,您应该使用参数化查询。他们将摆脱转换问题并防止 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 注入,从而使您的代码更加安全。

【讨论】:

    猜你喜欢
    • 2017-06-19
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多