0

SQL ステートメントのクエリが null を返します。私を夢中にさせているのは、loadSchema を機能させて、各テーブルのすべてのテーブルと列を出力できることです。しかし、単純なクエリを正常に実行できません。なぜこれが起こっているのでしょうか?

public function db():void {
    conn = new SQLConnection(); 
    conn.addEventListener(SQLEvent.OPEN, openHandler);
    dbFile = File.applicationStorageDirectory.resolvePath("DB.sql");
    conn.open(dbFile);
}

private function openHandler(event:SQLEvent):void { 
    trace("The database was created successfully"); 
    makeTables(); 
    trace("Make Tables Called");
}

テーブルの作成方法:

private function makeTables():void{
        var createGraduateTable:SQLStatement = new SQLStatement();
        createGraduateTable.sqlConnection = conn; 
        createGraduateTable.text = graduateLoader.data;

        var createGraduateAgeTable:SQLStatement = new SQLStatement();
        createGraduateAgeTable.sqlConnection = conn; 
        createGraduateAgeTable.text = graduateAgeLoader.data;

        var createMarathonTable:SQLStatement = new SQLStatement();
        createMarathonTable.sqlConnection = conn; 
        createMarathonTable.text = marathonLoader.data;

        try { 
            createGraduateTable.execute();
            createGraduateAgeTable.execute(); 
            createMarathonTable.execute();
            trace("Tables Created");
            // Describe Database
            conn.loadSchema(SQLTableSchema);
            for each(var SQLTableStmt:SQLTableSchema in conn.getSchemaResult().tables){
                trace("Table: " + SQLTableStmt.name );
                for each ( var SQLColm:SQLColumnSchema in SQLTableStmt.columns){
                    trace("Column name: " + SQLColm.name);
                }
            }
            queryDB();

        }catch(error:SQLError){
            trace("Error message:", error.message); 
            trace("Details:", error.details);  
        }
    }

using リスナーをクエリして、catch ブロックを試してみましたが、何も機能しません。

queryDB メソッド:

public function queryDB(tableName:String = null):void{
        var query:SQLStatement = new SQLStatement(); 
        query.sqlConnection = conn;
        query.text = "SELECT * FROM GRADUATE";
              //query.addEventListener(SQLEvent.RESULT, queryResult); 
              //query.addEventListener(SQLErrorEvent.ERROR, queryError); 
        try{
            query.execute(); 
            var result:SQLResult = query.getResult(); 
            if (result != null){
                trace("Results: " +  result.data);  
            }else{
                trace("Result NULL");
            }

        }catch(e:SQLError){

        }
    }

    private function queryResult(e:SQLEvent):void{
        var result:SQLResult = e.target.getResult();
        trace("Results: " +  result.data);
        conn.close();
    }

    private function queryError(e:SQLErrorEvent):void{
        trace("Error message:", e.error.message);
        trace("Query Error: " + e.error.details);
    }

私が言ったように、奇妙なことに、これを実行すると、すべてのテーブル名と列が正しく出力されますが、result.data は常に null です。どんな助けでも大歓迎です。

GRADUATE_AGE テーブルの作成に使用される Graduate_age.sql ファイルの最初の 20 行を次に示します。

-- DROP TABLE IF EXISTS GRADUATE_AGE; 
CREATE TABLE IF NOT EXISTS GRADUATE_AGE (
    GPA REAL,
    CREDITS_ATTEMPTED REAL,
    CREDITS_PASSED REAL,
    CURRENT_CREDITS REAL,
    AGE REAL,
    GENDER TEXT
);
INSERT INTO GRADUATE_AGE VALUES ( 2.7, 138.5, 138.5, 7, 25.74, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 3.57, 146, 78, 9, 22.09, 'F' );
INSERT INTO GRADUATE_AGE VALUES ( 3.63, 131, 131, 14, 23.21, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 3.86, 152, 119, 14, 26.56, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 3.03, 115.5, 115.5, 15, 26.3, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 2.25, 39, 39, 16, 23.8, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 0, 48, 0, 14, 22.45, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 3.02, 63.5, 51.5, 14.5, 25.4, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 3.14, 40, 40, 14, 32.93, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 2.73, 62, 62, 14, 21.35, 'M' );
INSERT INTO GRADUATE_AGE VALUES ( 3.39, 144, 81, 17, 24.32, 'M' );

@crooksy88 に応えて、queryDB() メソッド呼び出しを insert() メソッド呼び出しに置き換え、次の宣言を行いました。

private function insert():void{
        trace("Attempt Insert");
        var insert:SQLStatement = new SQLStatement(); 
        insert.sqlConnection = conn;
        var insertStr:String = "";
        insertStr += "INSERT INTO GRADUATE_AGE (GPA, CREDITS_ATTEMPTED, CREDITS_PASSED, CURRENT_CREDITS, AGE, GENDER) VALUES ( 2.7, 138.5, 138.5, 7, 25.74, 'M' );";
        insertStr += "INSERT INTO GRADUATE_AGE (GPA, CREDITS_ATTEMPTED, CREDITS_PASSED, CURRENT_CREDITS, AGE, GENDER) VALUES ( 3.57, 146, 78, 9, 22.09, 'F' );";
        insert.text = insertStr;
        insert.addEventListener(SQLEvent.RESULT, queryResult); 
        insert.addEventListener(SQLErrorEvent.ERROR, queryError);
        insert.execute();
    }

private function insertResult(e:SQLEvent):void{
        trace("Insert Complete: " + e.target.text);
        queryDB();
    }

結果はまだnullになっています。私を狂わせる!それは何かばかげているに違いない。

4

2 に答える 2

0

に挿入する方が良いかもしれGRADUATE_AGEませんGRADUATE;)

于 2013-03-14T20:44:44.823 に答える
0

おそらく、最初に非常に単純な SQL ステートメントを使用してテーブルを作成し、1 つのレコードを挿入する方法が考えられます。それが機能する場合は、その上に構築できます。

最初に、SQL ステートメントからすべてのアンダースコアを削除し、場合によってはテーブルと列に小文字の名前を付けて、SQL キーワードとより簡単に区別できるようにします。

また、SQL ステートメントでいくつかの点が間違っているようです。

GRADUATE_AGE という名前のテーブルを作成していますが、GRADUATE に挿入しようとしています。

CREATE TABLE IF NOT EXISTS graduate (id INTEGER PRIMARY KEY AUTOINCREMENT, gap REAL, creditsAttempted REAL, creditsPassed REAL, currentCredits REAL, age INTEGER, gender TEXT)

INSERT INTO graduate (gap, creditsAttempted, creditsPassed, currentCredits, age, gender) VALUES (2.7, 138.5, 138.5, 7, 25.74, 'M')
于 2013-03-14T20:49:37.573 に答える