9

これまで、私は ORM を避け、パラメータ化されたクエリなどを常に手作りしてきました。これは非常に時間がかかり、最初にアプリケーションを開発するときは本当に苦痛です。最近、ORM、特に Sqlite.NET ORM をもう一度見てみることにしました。

SQLite ORM 機能を使用したいのですが、ネイティブ SQL コマンドのバッチを実行してデータベースに事前入力することもできます。

SqliteNetExtensions-MvvmCross dll を使用して 1 対多の関係などを有効にしていますが、これはすべて問題ないようです。私の問題は、データベースに構成データをシードしたいときに発生します。次々と実行される一連の sql ステートメントを含む sql ファイルを単純に提供することを望んでいました。

GitHub から SQlite.NET コードを取得し、テストを実行しました。次に、単純な [Product] テーブルを持つ StringQueryTests クラスを拡張して、次のことを行いました。

     [Test]
    public void AlanTest()
    {
      StringBuilder sb = new StringBuilder(200);
      sb.Append(" DELETE FROM Product;");
      sb.Append(" INSERT INTO Product VALUES (1,\"Name1\",1,1);");
      sb.Append(" INSERT INTO Product VALUES (2,\"Name2\",2,3);");
      db.Execute(sb.ToString());
    }

これを実行してもエラーは発生せず、実際には最初のコマンドのみが実行されるようです。sb.ToString() の内容を sqlite データベース クエリ ウィンドウに貼り付けると、問題なく動作します。

これは予想される動作ですか?もしそうなら、上記のようなアプローチを使用できるように、これを克服するにはどうすればよいですか。可能であれば、すべての SQL ステートメントを管理するためにオブジェクトを作成する必要はありません。

この問題を克服するために採用できるアプローチがいくつかあることがわかります。この問題を解決できると思われる回避策や提案はありますか?

敬具

アラン。

4

2 に答える 2

3

私もこの問題に遭遇しました。その理由を説明しているブログ記事を見つけました。

行方不明になった場合の投稿の内容は次のとおりです。

[sqlite-net の] すべてのコードは、結果コードを正しくチェックし、それに応じて例外をスローします。

関連するすべてのコードをここに投稿したわけではありませんが、確認しました。この動作の本当の起源は、ネイティブの sqlite3.dll sqlite3_prepare_v2 メソッドにあります。ドキュメントの関連部分は次のとおりです。

これらのルーチンは zSql の最初のステートメントのみをコンパイルするため、*pzTail はコンパイルされていないものを指しているままになります。sqlite-net はコンパイルされていない末尾に対して何もしないため、コマンドの最初のステートメントのみが実際に実行されます。残りは黙って無視されます。ほとんどの場合、sqlite-net を使用しているときは気付かないでしょう。マイクロ ORM レイヤーを使用するか、個々のステートメントを実行します。頭に浮かぶ唯一の一般的な例外は、通常は複数ステートメントのバッチである DDL または移行スクリプトを実行しようとすることです。

于 2015-10-20T02:52:19.200 に答える
3

できませんか :

    [Test]
    public void AlanTest()
    {
        var queries = new List<string> () 
        {
            " DELETE FROM Product",
            " INSERT INTO Product VALUES (1,\"Name1\",1,1)",
            " INSERT INTO Product VALUES (2,\"Name2\",2,3)"
        };

        db.BeginTransaction ();
        queries.ForEach (query => db.Execute (query));
        db.Commit ();
    }

トランザクションは本当に必要ありません。より高速な実行/チェックポイントのロールバックだけです...

于 2015-01-09T04:16:33.397 に答える