【问题标题】:Flex Air Application SQLStatement returns nullFlex Air 应用程序 SQLStatement 返回 null
【发布时间】:2013-03-14 00:18:34
【问题描述】:

我的 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 始终为空。非常感谢任何帮助。

这里是用于创建 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();
    }

我的结果仍然为空。快把我逼疯了!它一定是一些愚蠢的东西。

【问题讨论】:

  • 你能告诉我们实际的sql语句吗?即,gradientLoader.data、graduateAgeLoader.data 和 marathonLoader.data
  • 是的,我有一种感觉,那就是我的错误所在。但我认为我所有的 sql 文件都是有效的 sql 和 sqllite。我更新了帖子以显示我的graduate_age.sql 文件的前20 行
  • 我刚刚添加了以下方法:

标签: apache-flex air null adobe


【解决方案1】:

也许要走的路是首先使用一个非常简单的 SQL 语句来创建表并插入一条记录。如果可行,您可以在此基础上再接再厉。

我会首先尝试从您的 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')

【讨论】:

  • 我会试试的。感谢您的提示
  • 感谢您的建议。我更新了我的帖子以反映您的更改。还是一样的问题。在这里对我来说是真正的大脑破坏者。
  • 抱歉浪费了您的时间。这是一个简单的sql错误。愚蠢的愚蠢的我。谢谢你的帮助。很抱歉给您带来不便。
【解决方案2】:

你最好插入GRADUATE_AGE而不是GRADUATE;)

【讨论】:

  • 对不起。我发错了。我实际上也有一个 GRADUATE 表。一个graduate.sql 文件,它创建一个名为GRADUATE 的表。它非常相似。我也尝试过使用SELECT * FROM GRADUATE_AGE,但无济于事。
  • 感谢您的帮助。这不是实际问题,但它帮助我仔细查看了实际问题所在的 sql 文件。谢谢。很抱歉浪费了您的时间。
  • 没有必要原谅。我们在这里互相帮助。 :)
猜你喜欢
  • 2011-07-23
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
相关资源
最近更新 更多