¿Cómo puedo solucionar el problema “‘” en sqlite y c #?

Estoy trabajando en Microsoft Visual C # 2008 Express con Sqlite.

Entiendo que un apostrope (‘) en mi texto tiene problemas en una consulta. Mi problema es que pensé que podría reemplazarlo por \ ‘. Parece que no funciona … Aquí hay un ejemplo de mi código:

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

El error que recibo es: error de SQLite: cerca de “t”: error de syntax

He intentado un par de otros reemplazos … como el otro corte. Y escribí mi cadena y una versión reemplazada de mi cadena en la consola para asegurarme de que saliera bien.

¿Qué error estúpido estoy haciendo aquí?

¡Gracias!

-Adeena

La solución presentada por Robert funcionará (es decir, reemplazando ' por '' ).

Alternativamente puede usar parámetros como en:

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

El uso de parámetros protege contra la inyección de sql y hace que los “problemas estén lejos”.

También es mucho más rápido porque sqlite puede reutilizar el plan de ejecución de sentencias cuando usa parámetros. No puede cuando no usas parámetros. En este ejemplo, el uso de un parámetro hace que la acción de inserción masiva sea aproximadamente 3 veces más rápida.

 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 se comporta de forma similar a Oracle en lo que respecta a la importancia de utilizar sentencias sql parametrizadas.