2009-05-24 14 views
6

私はMicrosoft Visual C#2008 ExpressでSqliteを使っています。sqliteとc#の ""問題をどうやって解決しますか?

私のテキスト内のアポストロピー( ')は、クエリに問題があることを理解しています。私の問題は、私が\ 'で置き換えることができると思ったことです。

string myString = "I can't believe it!"; 
cmd.CommandText = "Insert into myTable (myid,mytext) values (1,'" + myString.Replace("'","\\'") + "');"; 

私が手にエラーがある: SQLiteのエラー:「T」の近くに :構文エラー

私は、それはここに私のコードのダウンparred例です...動作していないようです他のスラッシュのようにいくつかの代替品を試しました...。そして私は自分のストリングと交換したバージョンのストリングをコンソールに書き出して、それが正しく出ていることを確認しました。

ここで私はどんな愚かなエラーですか?

ありがとうございます!

-Adeena

答えて

18

ロバートによって提示される解決策は、(すなわち''によって'を交換する)動作します。

別の方法としては、のようにパラメータを使用することができますパラメータを使用して

DbCommand cmd = new DbCommand(); 
DbParameter param = cmd.CreateParameter(); 
// ... 
// more code 
// ... 
cmd.CommandText = "Insert table (field) values (@param)"; 
param.ParameterName = "param" 
param.DbType = DbType.String; 
param.Value = @"This is a sample value with a single quote like this: '"; 
cmd.Parameters.Add(param); 
cmd.ExecuteNonQuery(); 
+2

+1はパラメータを使用しています。 Robertのソリューションはもちろん動作しますが、パラメータを使用するとSQLインジェクション攻撃からも保護されます。 –

+0

これで、 '入力で' 'tho'に置き換えられます。 – Blindy

7

SQLインジェクションから保護し、「問題が離れてQOなります。

sqliteはパラメータを使用するときにステートメントの実行計画を再利用できるので、はるかに高速です。パラメータを使用していないときはできません。この例では、パラメータを使用すると、バルク挿入動作が約3倍高速になります。

private void TestInsertPerformance() { 
    const int limit = 100000; 
    using (SQLiteConnection conn = new SQLiteConnection(@"Data Source=c:\testperf.db")) { 
    conn.Open(); 
    using (SQLiteCommand comm = new SQLiteCommand()) { 
     comm.Connection = conn; 
     comm.CommandText = " create table test (n integer) "; 
     comm.ExecuteNonQuery(); 
     Stopwatch s = new Stopwatch(); 
     s.Start(); 
     using (SQLiteTransaction tran = conn.BeginTransaction()) { 
     for (int i = 0; i < limit; i++) { 
      comm.CommandText = "insert into test values (" + i.ToString() + ")"; 
      comm.ExecuteNonQuery(); 
     } 
     tran.Commit(); 
     } 
     s.Stop(); 
     MessageBox.Show("time without parm " + s.ElapsedMilliseconds.ToString()); 

     SQLiteParameter parm = comm.CreateParameter(); 
     comm.CommandText = "insert into test values (?)"; 
     comm.Parameters.Add(parm); 
     s.Reset(); 
     s.Start(); 
     using (SQLiteTransaction tran = conn.BeginTransaction()) { 
     for (int i = 0; i < limit; i++) { 
      parm.Value = i; 
      comm.ExecuteNonQuery(); 
     } 
     tran.Commit(); 
     } 
     s.Stop(); 
     MessageBox.Show("time with parm " + s.ElapsedMilliseconds.ToString()); 

    } 
    conn.Close(); 
    } 
} 

Sqliteは、パラメータ化されたSQL文を使用することの重要性に関して、Oracleと同様に動作します。

+0

合意。これははるかに良い答えです。 –

+0

conn.Close()を呼び出す必要がありますか?「使用中」でconnを取得していますか?それは冗長だと言われました。 –

関連する問題