2013-10-20 18 views
13

Ich versuche, SQLite als mein Speicher zu verwenden. Ich habe Referenzdll mit nuget und using Anweisung hinzugefügt.SQLite einfach einfügen Abfrage

Ich habe

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

und ich schicke Abfrage txt wie diese

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

Mein db korrekt erstellt und übergeben Buch-Instanz mit gültigen Daten ist in Ordnung. Aber eine Ausnahme wird immer beim Ausführen der Abfrage auf dieser Codezeile ausgelöst:

sql_cmd.ExecuteNonQuery(); 

Ich mache offensichtlich etwas falsch hier, aber ich kann nicht sehen.

Update: geworfen Ausnahmemeldung ist

SQL Logikfehler oder fehlende Datenbank

unerkannt token: "22cf"

wo diese 22cf Teil weitergegeben book.Id guid Zeichenfolge ist.

+0

Welche Ausnahme wird ausgelöst? – Alireza

+0

@Alireza aktualisiert questio – user2783193

+0

Ich bemerkte, dass Sie keine formalen Parameter zu Ihrem SQL-Befehl verwenden. Dies ist nicht sehr ratsam, da Sie sich Sorgen machen müssen, Daten in einer SQL-Anweisung darzustellen (z. B. Datumsangaben, Dezimaltrennzeichen usw.). –

Antwort

-2

Sie sollten (') beim Senden einer Zeichenfolge in die INSERT-Anweisung VALUES (@ {0},' @ {1} ',' @ {2} ',' @ {3} ',' @ {4} ‘, '@ {5}', '@ {6}', '@ {7}, {8}) Sie sollten auch SQLExeprion

+0

Große Antwort, würde ich wahrscheinlich benannte Parameter wie hier vorgeschlagen http://stackoverflow.com/questions/809246/adding-parameters-in-sqlite-with-c-sharp Warum? weil Sie in einigen meiner SQL-Anweisungen denselben Parameter einige Male verwenden. – infocyde

41

Don't EVER insert your data in your statement!

Verwenden vorbereitete Anweisungen und binden Parameter fangen:

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

Dieses Beispiel funktioniert nicht, wenn Parameter keine Zeichenfolge sind. –

+1

Das ist nicht korrekt: [SqlParameterCollection.Add] (https://msdn.microsoft.com/en-us/library/ms136439.aspx) akzeptiert Objektwerte. Implementierungen werden natürlich .NET-Typen in geeignete Datenbanktypen konvertieren. Die SQLite-Implementierung akzeptiert String-Typen, aber auch numerische Typen, null, ... –

+0

Das ist SQLiteParameterCollection.Add(), aber Sie haben Recht - es akzeptiert Object. Ich muss einen Fehler gemacht haben, als ich getestet habe. In jedem Fall zeigt IntelliSense diese Version von Add() nicht an, sobald Sie die öffnende Klammer eingeben (es wird nur angezeigt, wenn Sie vor dem Hinzufügen tippen). –