43


2

SQLStatement.execute() - 1つのステートメントに複数の照会

私はhttp://en.wikipedia.org/wiki/SQL[SQL]でデータベース生成スクリプトを書き、私のhttp://en.wikipedia.org/wiki/Adobe_Integrated_Runtime[Adobe AIR]アプリケーションでそれを実行したいと思います。 :

Create Table tRole (
    roleID integer Primary Key
    ,roleName varchar(40)
);
Create Table tFile (
    fileID integer Primary Key
    ,fileName varchar(50)
    ,fileDescription varchar(500)
    ,thumbnailID integer
    ,fileFormatID integer
    ,categoryID integer
    ,isFavorite boolean
    ,dateAdded date
    ,globalAccessCount integer
    ,lastAccessTime date
    ,downloadComplete boolean
    ,isNew boolean
    ,isSpotlight boolean
    ,duration varchar(30)
);
Create Table tCategory (
    categoryID integer Primary Key
    ,categoryName varchar(50)
    ,parent_categoryID integer
);
...

私は次の方法でAdobe AIRでこれを実行します。

public static function RunSqlFromFile(fileName:String):void {
    var file:File = File.applicationDirectory.resolvePath(fileName);
    var stream:FileStream = new FileStream();
    stream.open(file, FileMode.READ)
    var strSql:String = stream.readUTFBytes(stream.bytesAvailable);
    NonQuery(strSql);
}

public static function NonQuery(strSQL:String):void {
    var sqlConnection:SQLConnection = new SQLConnection();
    sqlConnection.open(File.applicationStorageDirectory.resolvePath(DBPATH));
    var sqlStatement:SQLStatement = new SQLStatement();
    sqlStatement.text = strSQL;
    sqlStatement.sqlConnection = sqlConnection;
    try {
        sqlStatement.execute();
    } catch (error:SQLError) {
        Alert.show(error.toString());
    }
}

エラーは発生しませんが、 `tRole`だけが存在します。 最初のクエリだけを見ているようです(セミコロンまで - 削除するとクエリは失敗します)。 1つのステートメントで複数のクエリを呼び出す方法はありますか?

3 Answer


20


これを使って巻き取った。 これは一種のハックですが、実際にはかなりうまくいきます。

唯一のことはあなたがあなたのセミコロンに非常に注意しなければならないということです。 :D

var strSql:String = stream.readUTFBytes(stream.bytesAvailable); var i:Number = 0; var strSqlSplit:Array = strSql.split( ";"); for(i = 0; i <strSqlSplit.length; i){NonQuery(strSqlSplit [i] .toString()); }


10


http://en.wikipedia.org/wiki/SQLite [SQLite] APIは `sqlite_prepare`のようなものと呼ばれる関数を持っています。これは_one_ステートメントを取り、それを実行するための準備をし、本質的にSQLを解析してメモリに保存します。 これは、ステートメントが何度も実行されても、SQLをデータベースエンジンに1回送信すればよいことを意味します。

とにかく、ステートメントは単一のSQLクエリであり、それは単なるルールです。 AIR SQL APIは生のSQLをSQLiteに送信することを許可していません。単一のステートメントのみであり、その理由はおそらく、AIRがSQLiteと通信するときに `sqlite_prepare`関数を使用するためです。


3


"; \ n"のようにデリミタをもう少し複雑なものにしても、それほど頻繁には表示されません。 ファイルを作成するときには、必ず1、2行の改行を入れてください。 私はファイルの作成に2つの "\ n \ n"を入れることになりました。