2013-10-20 32 views
13

SQLite'ı depolama alanım olarak kullanmaya çalışıyorum. Ben nuget kullanarak ve deyim kullanarak referans dll ekledim.SQLite basit ekleme sorgusu

Ben

private void SetConnection() 
{ 
      sql_con = new SQLiteConnection 
       ("Data Source=c:\\Dev\\MYApp.sqlite;Version=3;New=False;Compress=True;"); 
} 

private void ExecuteQuery(string txtQuery) 
{ 
      SetConnection(); 
      sql_con.Open(); 
      sql_cmd = sql_con.CreateCommand(); 
      sql_cmd.CommandText = txtQuery; 
      sql_cmd.ExecuteNonQuery(); 
      sql_con.Close(); 
} 

var ve doğru oluşturulan ve geçerli verilerle geçirilen kitap örneği tamam bu

public void Create(Book book) 
{ 
      string txtSqlQuery = "INSERT INTO Book (Id, Title, Language, PublicationDate, Publisher, Edition, OfficialUrl, Description, EBookFormat) "; 
      txtSqlQuery += string.Format("VALUES (@{0},@{1},@{2},@{3},@{4},@{5},@{6},@{7},{8})", 
         book.Id, book.Title, book.Language, book.PublicationDate, book.Publisher, book.Edition, book.OfficialUrl, book.Description, book.EBookFormat); 
        try 
        { 
         ExecuteQuery(txtSqlQuery); 
        } 
        catch (Exception ex) 
        { 
         throw new Exception(ex.Message); 
        }  
} 

Benim db gibi sorgu txt yolluyorum.

sql_cmd.ExecuteNonQuery(); 

Açıkçası burada yanlış bir şey yaptığını ama göremiyorum: Ama istisna bu kod satırında Sorgu yürütülürken her zaman atılır.

Güncelleme: "22cf"

bu 22cf geçti book.Id guid dize parçasıdır: atılmış istisna mesajı

SQL mantık hatası ya da eksik veritabanı

tanınmayan işaret olduğunu.

+0

Hangi özel durum atılıyor? – Alireza

+0

@Alireza güncellendi arayışı – user2783193

+0

SQL komutunuza resmi parametreler kullanmadığınızı farkettim. Bu çok tavsiye edilmez, çünkü bir SQL deyimine (örneğin, biçimlendirme tarihleri, ondalık ayırıcılar vb.) Veri sunma konusunda endişelenmeniz gerekecektir. –

cevap

-2

INSERT ifadesine VALUES (@ {0}, '@ {1}', '@ {2}', '@ {3}', '@ {4} biçiminde dize gönderirken kullanmalısınız ('). ', '@ {5}', '@ {6}', '@ {7}'{8}) da kullanın ifadeleri ve bağlama parametrelerini hazırlanan

+0

Büyük cevap, muhtemelen burada önerilen şekilde önerilen params kullanıyorum http://stackoverflow.com/questions/809246/adding-parameters-in-sqlite-with-c-sharp Neden? çünkü bazı sql ifademde aynı parametreyi birkaç farklı kez kullanıyor olabilirsiniz. – infocyde

41

Don't EVER insert your data in your statement!

SQLExeprion yakalamak olmalıdır:

public void Create(Book book) { 
    SQLiteCommand insertSQL = new SQLiteCommand("INSERT INTO Book (Id, Title, Language, PublicationDate, Publisher, Edition, OfficialUrl, Description, EBookFormat) VALUES (?,?,?,?,?,?,?,?)", sql_con); 
    insertSQL.Parameters.Add(book.Id); 
    insertSQL.Parameters.Add(book.Title); 
    insertSQL.Parameters.Add(book.Language); 
    insertSQL.Parameters.Add(book.PublicationDate); 
    insertSQL.Parameters.Add(book.Publisher); 
    insertSQL.Parameters.Add(book.Edition); 
    insertSQL.Parameters.Add(book.OfficialUrl); 
    insertSQL.Parameters.Add(book.Description); 
    insertSQL.Parameters.Add(book.EBookFormat); 
    try { 
     insertSQL.ExecuteNonQuery(); 
    } 
    catch (Exception ex) { 
     throw new Exception(ex.Message); 
    }  
} 
+0

Parametreler dize türü değilse, bu örnek çalışmaz. –

+1

Bu doğru değil: [SqlParameterCollection.Add] (https://msdn.microsoft.com/en-us/library/ms136439.aspx) Nesne değerlerini kabul eder. Elbette, uygulamalar .NET türlerini uygun veritabanı türlerine dönüştürecek. SQLite uygulama, string türlerini kabul eder, ayrıca sayısal türler, null, ... –

+0

Bu SQLiteParameterCollection.Add(), ancak siz haklısınız - Object'i kabul eder. Test ettiğimde bir hata yapmış olmalıyım. Her durumda, IntelliSense, açılış parantezini yazdığınızda Add() sürümünü göstermez (yalnızca Ekle'den önce yazdığınızda bunu gösterir). –