2009-05-24 23 views
6

我正在使用Sqlite在Microsoft Visual C#2008 Express中工作。如何解决sqlite和c#中的“'”问题?

据我所知,我的文本中的一个''''在查询中有问题。我的问题是我认为我可以用\'替换它。它似乎并不奏效......这里是我的代码parred下来例如:

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

我得到的错误是: SQLite的错误: 附近的“T”:语法错误

我已经尝试了其他替代品......就像其他的斜线一样。然后我将我的字符串和我的字符串的替换版本写入控制台,以确保它正确地出来。

我在这里犯了什么愚蠢的错误?

谢谢!

-Adeena

回答

18

由Robert提出的解决方案将工作(即,通过更换''')。

或者您可以使用参数为:

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使用参数。罗伯特的解决方案当然会起作用,但使用参数将有助于防止SQL注入攻击。 – 2009-05-24 23:00:20

+0

因此,将替换'在'输入''寿。 – Blindy 2009-05-25 00:24:27

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

当涉及到使用参数化的sql语句的重要性时,Sqlite的行为类似于Oracle。