2016-07-28 56 views
0

我现在完全被SQLite弄糊涂了。 我用的是System.Data.SQLite版本的C#为什么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命令的常量字符串工作):

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(); 

在这两种情况下,我做了decimal列相同插入:

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


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

对于表2插入:

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)没有'试了一下 。但比声明认为它有两列三个值...

+0

由于使用了默认语言设置,所以会出现ID猜测。 – BugFinder

+0

我在哪里找到他们?为什么不同的行为? – Evosoul

+0

阅读http://stackoverflow.com/questions/28084261/comma-vs-dot-as-decimal-separator – BugFinder

回答

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注入,从而使你的代码更安全。

相关问题