2013-03-14 69 views
0

我的SQL语句查询返回null。让我疯狂的是,我可以让loadSchema工作并打印出每张表的所有表和列。但是我无法成功执行简单的查询。任何想法,为什么这可能会发生?Flex空应用程序SQLStatement返回null

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); 
     } 
    } 

我试着查询使用监听器的,并尝试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我替换insert()方法调用queryDB()方法调用,并给它下面的声明:

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, quereyResult); 
     insert.addEventListener(SQLErrorEvent.ERROR, quereyError); 
     insert.execute(); 
    } 

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

我仍然得到空了我的结果。快把我逼疯!它的确很愚蠢。

+0

你能告诉我们实际的sql语句吗?即graduateLoader.data,graduateAgeLoader.data和marathonLoader.data – crooksy88 2013-03-14 11:18:46

+0

是的,我有一种感觉,那就是我的错误所在。但我认为我所有的sql文件都是有效的sql和sqllite。我已更新帖子以显示我的graduate_age.sql文件的前20行 – sdc 2013-03-14 20:34:38

+0

我刚刚添加了以下方法: – sdc 2013-03-14 22:35:15

回答

0

也许去将是第一个使用非常简单的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') 
+0

我会试试看。感谢您的提示 – sdc 2013-03-14 21:21:33

+0

感谢您的建议。我更新了我的帖子以反映您的更改。仍是同样的问题。真正的大脑克星在这里。 – sdc 2013-03-14 22:47:23

+0

对不起,浪费你的时间。这是一个简单的SQL错误。愚蠢的我。谢谢你的帮助。抱歉给你带来不便。 – sdc 2013-03-14 23:12:22

0

它可能会更好,你会插入GRADUATE_AGE和不进GRADUATE;)

+0

对不起。我发布了错误的一个。我其实也有一个GRADUATE表。一个可以创建一个名为GRADUATE的表的graduate.sql文件。它非常相似。我试过使用'SELECT * FROM GRADUATE_AGE'以及无效。 – sdc 2013-03-14 21:20:25

+0

感谢您的帮助。这不是真正的问题,但它帮助我仔细看看实际问题出在哪里的sql文件。谢谢。对不起,浪费你的时间。 – sdc 2013-03-14 23:14:02

+0

没有必要为借口。我们在这里互相帮助。 :) – 2013-03-16 08:56:32

相关问题