Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我怎样才能绕过这个“问题”'&引用;sqlite和c#中的问题?_C#_String_Sqlite - Fatal编程技术网

我怎样才能绕过这个“问题”'&引用;sqlite和c#中的问题?

我怎样才能绕过这个“问题”'&引用;sqlite和c#中的问题?,c#,string,sqlite,C#,String,Sqlite,我与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一起在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

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

使用参数可以防止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();
  }
}
private void TestInsertPerformance(){
常数int限值=100000;
使用(SQLiteConnection conn=newsqliteconnection(@“数据源=c:\testperf.db”)){
conn.Open();
使用(SQLiteCommand comm=new SQLiteCommand()){
通信连接=连接;
comm.CommandText=“创建表测试(n整数)”;
comm.ExecuteNonQuery();
秒表s=新秒表();
s、 Start();
使用(SQLiteTransaction tran=conn.BeginTransaction()){
对于(int i=0;i

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

+1用于使用参数。Robert的解决方案当然会起作用,但使用参数也有助于防止SQL注入攻击。用“”替换输入中的“”也会起作用。这是目前为止最好的答案。当conn处于“使用”状态时,是否需要调用conn.Close()?有人告诉我那是多余的。