Wie führen Sie einen Batch von SQL-Anweisungen mit SQLite.NET PCL aus?

8

In der Vergangenheit habe ich ORM gemieden und immer manuell parametrisierte Abfragen etc. erstellt. Dies ist sehr zeitaufwendig und ein echter Schmerz bei der ersten Entwicklung einer Anwendung. Kürzlich habe ich mich entschieden, ORM speziell im Sqlite.NET ORM zu betrachten.

Ich würde gerne die ORM-Funktionen von SQLite verwenden, aber auch einen Stapel nativer SQL-Befehle zum Auffüllen einer Datenbank ausführen können.

Wir verwenden die SqliteNetExtensions-MvvmCross-DLL, um Eins-zu-Viele-Beziehungen usw. zu aktivieren, und das alles sieht gut aus. Meine Probleme treten auf, wenn ich die Datenbank mit Konfigurationsdaten initiieren möchte. Ich hoffte, einfach eine SQL-Datei zur Verfügung zu stellen, die eine Reihe von SQL-Anweisungen enthielt, die nacheinander ausgeführt wurden.

Ich habe den SQlite.NET-Code von GITHub abgerufen und die Tests ausgeführt. Ich habe dann die StringQueryTests-Klasse mit einer einfachen [Product] -Tabelle erweitert, um Folgendes zu tun: -

%Vor%

Wenn ich das ausführe, wird kein Fehler ausgegeben und tatsächlich scheint das Verhalten so zu sein, dass nur der erste Befehl ausgeführt wird. Wenn ich den Inhalt von sb.ToString () in ein sqlite-Abfragefenster einfüge, funktioniert es einwandfrei.

Ist das das erwartete Verhalten? Wenn ja, wie gehe ich vor, dies zu überwinden, damit ich einen Ansatz wie oben verwenden kann. Ich möchte nicht wirklich Objekte erstellen müssen, um alle SQL-Anweisungen zu verwalten, wenn möglich.

Ich kann sehen, dass es eine Reihe von Ansätzen gibt, die angenommen werden können, um dieses Problem zu lösen - jeder hat eine Arbeit oder Vorschläge, die glauben, dass sie dieses Problem lösen können?

Herzliche Grüße

Alan.

    
Alan 12.06.2014, 03:17
quelle

2 Antworten

1

Ich bin gerade auch auf dieses Problem gestoßen. Ich habe einen Blogbeitrag gefunden, der erklärt, warum.

Hier ist, was der Beitrag sagt, falls er fehlt.

  

Der gesamte Code [in sqlite-net] überprüft die Ergebniscodes korrekt und löst Ausnahmen aus.

     

Obwohl ich nicht alle relevanten Codes hier gepostet habe, habe ich es überprüft, und der wahre Ursprung dieses Verhaltens ist woanders - in der nativen Methode sqlite3.dll sqlite3_prepare_v2. Hier ist der relevante Teil der Dokumentation:

     

Diese Routinen kompilieren nur die erste Anweisung in zSql, sodass * pzTail auf das verweist, was nicht kompiliert wird.   Da sqlite-net nichts mit dem nicht kompilierten Tail tut, wird nur die erste Anweisung im Befehl ausgeführt. Der Rest wird still ignoriert. In den meisten Fällen werden Sie dies bei Verwendung von sqlite-net nicht bemerken. Sie werden entweder seine Micro-ORM-Ebene verwenden oder einzelne Anweisungen ausführen. Die einzige häufige Ausnahme, die Ihnen in den Sinn kommt, ist die Ausführung von DDL- oder Migrationsskripten, bei denen es sich typischerweise um Stapel mit Mehrfachanweisungen handelt.

    
Josh Close 20.10.2015, 02:52
quelle
3

Können Sie nicht tun:

%Vor%

Sie brauchen die Transaktion nicht wirklich, nur schnellere Ausführung / Checkpoint Rollback ...

    
baramuse 09.01.2015 04:16
quelle