2016-06-13 8 views
0

Ich habe verwendet SQLitePCL (derzeit ver. 3.8.7.2), und jetzt beschlossen, mit Delete und Update Cascade durch Aktivieren der Fremdschlüssel-Einschränkung zu experimentieren. Ich verstehe, dass diese Funktion standardmäßig deaktiviert ist und gemäß SQLite documentation muss die Einschränkung getrennt für jede Datenbankverbindung aktiviert werden.Wie setze ich die 'PRAGMA foreign_keys = ON' Anweisung mit SQLitePCL

Die Verbindungszeichenfolge nimmt nur einen Datenbankpfad (für SQLitePCL sowieso) und erlaubt keine flexiblere zusammengesetzte Verbindungszeichenfolge des Formulars data source=d:\foo\bar\mySqlite.db;foreign keys=ON. Wenn ich das Constaint für für jede Verbindung wie unten gezeigt aktivieren muss, wie die Einschränkung zu aktivieren?

Ich erwartete das ISQLiteStatement API einige Mittel zur Injektion des PRAGMA foreign_keys = ON Anweisung in meine Verbindungsanweisung aber sehen keine offensichtliche [Intellisense] Methode oder Eigenschaft zu schaffen, dies zu erreichen. Das Erforschen der SQLiteConnection-API ist nicht einmal ein Starter, da die Fremdschlüsseleinschränkung pro Verbindung sowieso ist.

Hinweis: DeleteItemByIdQuery() und BindIdToDeleteItemByIdQuery() Methoden unten geben SQL Query-Zeichenfolgen zurück, und Details werden der Kürze halber weggelassen.

using (ISQLiteStatement statement = new SQLiteConnection("d:\foo\bar\mySqlite.db").Prepare(DeleteItemByIdQuery())) 
{ 
    BindIdToDeleteItemByIdQuery(statement, id); 
    SQLiteResult result = statement.Step(); 
} 

Betrachte ich etwas Einfaches, oder ist das unmöglich? Hilfe!

Antwort

0

Okay, ich es herausgefunden:

die SQLiteConnection als äußere using Block behalten und eine Folge von PRAGMA und der Haupt Anweisung innerhalb ausführen. Komisch, ich dachte, ich hätte es vorher schon versucht und nicht das Ergebnis bekommen, das ich jetzt bekomme - andere Fehler könnten dann am Werk gewesen sein.

using (var conn = new SQLiteConnection(@"d:\foo\bar\mySqlite.db")) 
{ 
    // First turn ON the FK constraint 

    using (var statement = conn.Prepare(@"PRAGMA foreign_keys = ON")) 
    { 
     SQLiteResult result = statement.Step(); 
    } 

    // Then Delete item that will Cascade deletion in referencing table(s) 

    using (var statement = conn.Prepare(SqlDeleteItemById())) 
    { 
     SqlBindIdToDeleteItemById(statement, id); 
     SQLiteResult result = statement.Step(); 
    } 
} 
+0

Bitte beachten Sie, dass es sehr ineffizient ist, die Datenbank für jede Abfrage erneut zu öffnen. –

0

Die PRAGMA-Anweisung ist eine normale SQL-Anweisung; führe es einfach aus.

Um den Umfang der Eingabe zu reduzieren, können Sie eine Hilfsfunktion schreiben, um eine Verbindung zu erstellen und zu konfigurieren.

+0

Ich weiß, die PRAGMA ist eine normale SQL; Die Frage ist, wie man innerhalb einer einzelnen Verbindung ausführt. Ich habe die PRAGMA und die Hauptanweisung sequentiell innerhalb des 'using (var conn = new SQLiteConnection'-Blocks ausprobiert, aber nicht funktioniert. Das ließ mich annehmen, dass die PRAGMA möglicherweise Teil einer einzelnen' ISQLiteStatement-Anweisung' sein muss, aber ... Sieht aus wie die einfachste Sache, die offensichtlich sein sollte, aber überrascht, dass sie es nicht herausfinden konnte, trotz der Tatsache, dass ich SQLitePCL mit den meisten Funktionen verwendet habe (und beschlossen habe, zur relationalen Integritätswartung mit FK Constraint überzugehen). – user2921851