2017-08-19 8 views
1

SQLitePCLパッケージを使用してデータベースコマンド(create-select-update-delete)を実行する単純なUWPアプリケーションを開発しようとしています。私はいくつかのSQLiteのコマンドが含まれているデータベースのSQLファイルを作成し、私は私のコードでそれらを実行しようとしている:SQLitePCLの使用方法SQLファイルの内容を実行

 Uri appUri = new Uri("ms-appx:///Assets/db.sql"); 
     StorageFile sFile = StorageFile.GetFileFromApplicationUriAsync(appUri).AsTask().ConfigureAwait(false).GetAwaiter().GetResult(); 
     string sSQL = FileIO.ReadTextAsync(sFile).AsTask().ConfigureAwait(false).GetAwaiter().GetResult(); 
     ISQLiteStatement cnStatement = dbConnection.Prepare(sSQL); 
     cnStatement.Step(); 

しかし、私はプログラムを実行すると、それだけで、CREATEあるSQLファイルの最初のステートメントを実行します残りのコマンドを実行せずに終了します。ここでは、SQLファイルのサンプルコンテンツは以下のとおりです。

CREATE TABLE Superhero (
    Type TEXT PRIMARY KEY, 
    Picture TEXT 
); 

    INSERT INTO Superhero (
        Type, 
        Picture 
       ) 
       VALUES (
        'batman', 
        'batman.ico' 
       ); 

SQLファイルを実行するSQLitePCLでの方法がある場合は誰でも知っていますか? ご協力いただければ幸いです! ありがとう!

答えて

0

sqlite3_prepareインタフェースの説明によると:

これらのルーチンはのみZSQLの最初の文をコンパイルし、その* pzTailがコンパイルされていないまま何を指して残されています。

実際にコマンドの最初のステートメントだけが実行されるようです。残りの部分は静かに無視されます。すべてのコマンドは記号「;」で終わっているので、簡単で簡単な解決策として、SQLコマンドを単一の文に分割して1つずつ実行するだけです。たとえば:

string sSQL = FileIO.ReadTextAsync(sFile).AsTask().ConfigureAwait(false).GetAwaiter().GetResult(); 
var dbConnection = new SQLiteConnection("sun.db", SQLiteOpen.READWRITE); 
//using (ISQLiteStatement cnStatement = dbConnection.Prepare(sSQL)) 
//{ 
// var result = cnStatement.Step(); 
//} 
var statements = sSQL.Split(new[] { ';' }); 
foreach (string onestate in statements) 
{ 
    using (ISQLiteStatement cnStatement = dbConnection.Prepare(onestate)) 
    { 
     var result = cnStatement.Step(); 
    } 
} 

はそうしないと、SQLitePCL Nugetパッケージをアップデートする必要があるかもしれません。

関連する問題