Как я обхожу “'” проблему в sqlite и c#?

Если это весь файл, добавьте точку с запятой в конце. Измените его на:

"Test locale" = "Test locale" ;

6
задан adeena 24 May 2009 в 22:28
поделиться

2 ответа

Решение, представленное Робертом, будет работать (например, заменив ' на ' ').

В качестве альтернативы вы можете использовать параметры, как в:

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();
18
ответ дан 8 December 2019 в 04:31
поделиться

Использование параметров защищает от внедрения 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();
  }
}

Sqlite ведет себя так же, как Oracle, когда дело доходит до важности использования параметризованных операторов sql.

7
ответ дан 8 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: