Wie komme ich um das “‘” Problem in SQLite und C #?

Ich arbeite in Microsoft Visual C # 2008 Express mit Sqlite.

Ich verstehe, dass ein Apostrop (‘) in meinem Text Probleme in einer Abfrage hat. Mein Problem ist, dass ich dachte, ich könnte es durch ersetzen. Es scheint nicht zu funktionieren … Hier ist ein Beispiel für meinen Code:

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

Der Fehler, den ich bekomme, ist: SQLite-Fehler: nahe “t”: Syntaxerrors

Ich habe ein paar andere Ersatz versucht … wie der andere Schrägstrich. Und ich schrieb meine Saite und eine ersetzte Version meiner Saite an die Konsole, um sicherzustellen, dass sie richtig rauskam.

Was für ein dummer Fehler mache ich hier?

Vielen Dank!

-Adeena

Die von Robert präsentierte Lösung wird funktionieren (dh ' durch '' ersetzen).

Alternativ können Sie Parameter wie in verwenden:

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

Die Verwendung von Parametern schützt vor SQL-Injektion und macht die Probleme weg.

Es ist auch viel schneller, da SQLite den Ausführungsplan von statementen wiederverwenden kann, wenn Sie Parameter verwenden. Es kann nicht, wenn Sie keine Parameter verwenden. In diesem Beispiel wird durch die Verwendung eines Parameters die Bulk-Insert-Aktion ungefähr 3-mal schneller ausgeführt.

 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 verhält sich ähnlich wie Oracle, wenn es darum geht, parametrisierte SQL-statementen zu verwenden.