簡體   English   中英

如何解決sqlite和c#中的“'”問題?

[英]How do I get around the “'” problem in sqlite and c#?

我正在使用Sqlite在Microsoft Visual C#2008 Express中工作。

我知道我的文本中的一個叛逆者(')在查詢中有問題。 我的問題是,我認為我可以用\\'替換它。 它似乎沒有工作......這是我的代碼的一個例子:

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

我得到的錯誤是:SQLite錯誤:接近“t”:語法錯誤

我嘗試過其他一些替換品......就像其他的斜線一樣。 我將我的字符串和我的字符串的替換版本寫入控制台,以確保它正確出現。

我在這里犯了什么愚蠢的錯誤?

謝謝!

-Adeena

羅伯特提出的解決方案將起作用(即替換' by '' )。

或者,您可以使用以下參數:

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

使用參數可以防止sql注入,並使'問題慢慢消失。

它也快得多,因為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類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM