我怎样才能绕过这个“问题”'&引用;sqlite和c#中的问题?
我与Sqlite一起在Microsoft Visual C#2008 Express中工作 我知道文本中的撇号(')在查询中有问题。我的问题是我想我可以用\'来代替它。它似乎不起作用。。。下面是我的代码的一个简单例子:我怎样才能绕过这个“问题”'&引用;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("'","\\'") + "
string myString = "I can't believe it!";
cmd.CommandText = "Insert into myTable (myid,mytext) values (1,'" + myString.Replace("'","\\'") + "');";
我得到的错误是:
SQLite错误:
接近“t”:语法错误
我试过几个其他的替代品。。。就像另一条斜线。我把我的字符串和一个替换版本的字符串写到控制台上,以确保它是正确的
我在这里犯了什么愚蠢的错误
谢谢
-AdeenaRobert提出的解决方案将起作用(即用
'
替换'
)
或者,您可以使用参数,如中所示:
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()?有人告诉我那是多余的。