2016-07-28 8 views
0

私は今、SQLiteによって完全に混乱しています。私は2つの列を作成していることで (詳細はしかし、彼らは、この場合に重要であり、文は次のとおりです。なぜsqliteが変換されるのですか? To、

表1: 私は2つのテーブルを持っているC#

ためSystem.Data.SQLiteバージョンを使用しますそれを投稿するには長い間)。最初のものはRecStatと呼ばれ、2番目のものはDOXinMと呼ばれます。 どちらも、小数であり、このように作成されます。

[RectStat] Decimal, 
[DOXinM] Decimal, 

... ...

CREATE TABLEステートメントは、次のようになります。

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

私は価値の挿入この表は小数点が完全にうまく動作し、読んだときにはxaml GUIでも動作します。

その後、私は小数点以下桁も持つ2番目のテーブルを作成しました。 私は(私はすべてのSQLコマンド用のconst文字列で動作することに注意してください)を作成するためのテーブルを同じ方法で(これは短いものであるので、私は全体の声明を与えることができます)

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

C#コードを作成しました:表2を挿入するために

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


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

::私は10進数の列に同じ挿入を行い、両方の場合

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

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

私は最初の2つの作品は完全に罰金値を読み出したが、最後の1が後に番号なしで表示されたら今のデータベースは0,25 として10.5/1.3のように最初の2文と最後の1を挿入小数点"。

だから私の質問です。 これはなぜ起こりますか? (Btw私のテーブルには20個以上の小数点以下の桁があります。この問題のある唯一のものは「厚さ」です)

私はあなたを助けてくれることを願っています。事前に

おかげで リチャード、私が試してみました何

しようとした別の値が「」なしでそれを試してみました (それが原因で0.25であったという希望を持っていました)。しかし、文は、すべての

+0

idは、デフォルトの言語設定が使用されているためです。 – BugFinder

+0

どこで見つけるのですか?そして、なぜ違った行動をするのですか? – Evosoul

+0

read @stackoverflow.com/questions/28084261/comma-vs-dot-as-decimal-separator – BugFinder

答えて

2

まず...それは二つの列のための3つの値をと思っていたよりも、あなたはパラメータ化クエリを使用する必要があります。彼らは変換の問題を取り除き、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インジェクションを防ぐため、そのため、あなたのコードをより安全にします。

関連する問題