2009-05-24 20 views
6

Sqlite ile Microsoft Visual C# 2008 Express'te çalışıyorum.sqlite ve C# içindeki "'" sorununu nasıl çözebilirim?

Metnimde bir kesme işaretinin (') bir sorguda sorunları olduğunu anlıyorum. Benim sorunum, onun yerine \ 'ile değiştirebileceğimi düşündüm.

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

alıyorum hatadır: SQLite hatası: yakın "t": sözdizimi hatası

Ben Bu İşte benim kod aşağı parred örnek ... çalışıyor gibi görünmüyor diğer eğik çizgi gibi birkaç başka değiştirmeyi denedim. Ve dize ve dizimin değiştirilmiş bir sürümünü, doğru olarak geldiğinden emin olmak için konsola yazdım.

Burada ne aptal bir hata yapıyorum?

Teşekkürler! Robert tarafından sunulan

-Adeena

cevap

18

çözeltisi (yani '' ile ' yerine) çalışacaktır.

Alternatif olarak parametreleri kullanabilirsiniz: parametreleri kullanarak

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

+1. Robert'in çözümü elbette işe yarayacak, ancak parametreleri kullanarak SQL Injection saldırılarına karşı da korumaya yardımcı olacak. –

+0

Yani 'giriş ile' 'tho. – Blindy

7

sql enjeksiyon karşı korur ve 'sorunlar uzak qo yapar.

Ayrıca, çok daha hızlıdır çünkü sqlite, parametreler kullandığınızda deyimlerin yürütme planını yeniden kullanabilir. Parametreleri kullanmadığınız zaman olamaz. Bu örnekte bir parametre kullanmak, toplu ekleme eylemini yaklaşık 3 kat daha hızlı hale getirir. o parameterised sql ifadeleri kullanmanın önemi gelince

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 Oracle gibi davranırlar. Parametreleri kullanmak için

+0

Anlaşıldı. Bu şimdiye kadar daha iyi bir cevap. –

+0

Bir "kullanarak" bağladığınızda conn.Close() çağırmak gerekli mi? Ben gereksiz olduğu söylendi. –

İlgili konular