当前位置:  开发笔记 > 编程语言 > 正文

如何解决sqlite和c#中的"'"问题?

如何解决《如何解决sqlite和c#中的"'"问题?》经验,为你挑选了2个好方法。

我正在使用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



1> Paulo Santos..:

由罗伯特给出的解决方案将工作(即替换''').

或者,您可以使用以下参数:

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


+1使用参数.罗伯特的解决方案当然会起作用,但使用参数也有助于防止SQL注入攻击.

2> tuinstoel..:

使用参数可以防止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类似.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有