2014-03-07 24 views
0

我在应用程序中多次使用openAsync()函数以成功打开SQLite连接。但最近我补充说,还使用openAsync()更多的代码,现在我得到这个错误:如何在大型Flex应用程序中管理许多openAsync()调用?

Error: Error #3110: Operation cannot be performed while SQLStatement.executing is true. 
at Error$/throwError() 
at flash.data::SQLStatement/checkReady() 
at flash.data::SQLStatement/execute() 
at Function/com.lang.SQL:SQLErrorStack/deleteAllRecordsFromErrorStackTable/com.lang.SQL:connOpenHandler()[C:\work\Lang\trunk\actionscript\src\com\lang\SQL\SQLErrorStack.as:466] 

它看起来像前面的代码,而另一个已经开始没有执行完毕。 我的问题是:为什么第二个连接中的代码执行被拒绝?我期望使用某种队列机制,但事实并非如此。我到处寻找解决方案来解决这个问题,但我失败了。你能帮我吗?

一个能打开DB连接的问题能解决吗?我应该怎样修改我的代码?

这是类似于此的代码,在我的应用程序中出现了几次。

var SQLquery:String; 
SQLquery = "DELETE FROM ErrorStackTable"; 
     var sqlConn:SQLConnection = new SQLConnection(); 
     sqlConn.addEventListener(SQLEvent.OPEN, connOpenHandler); 

     var dbFile:File = new File(); 
     dbFile.nativePath = FlexGlobals.topLevelApplication.databaseFullPath_conf+"\\"+FlexGlobals.topLevelApplication.databaseName_conf; 

     sqlConn.openAsync(dbFile); // openDB 
     sqlSelect = new SQLStatement(); 
     sqlSelect.sqlConnection = sqlConn; 
     sqlSelect.text = SQLquery; 

     function connOpenHandler(event:SQLEvent):void 
     { 
      sqlSelect.addEventListener(SQLEvent.RESULT, resultSQLHandler); 
      sqlSelect.addEventListener(SQLErrorEvent.ERROR, errorHandler); 
      sqlSelect.execute(); 
     } 
+0

你不能坚持到连接?在几乎所有数据库平台中,确保连接是一个耗时的过程。 –

+0

我可以接受这种耗时的过程作为解决方案,只要它工作。如果你看看代码,你会注意到我将不得不重构我的代码。是不是真的值得吗?我没有很多数据库连接,但它们非常连续。 – chrisiek

+0

在结果或错误处理程序触发后,是否调用以优先执行下一个查询? –

回答

0

在大Flex应用程序尽量避免openAsync(DB)调用,因为SQL代码的reusablity的,如果u有许多SQL statments要执行,那么你应该定义越来越SQL statments。如果你有动态结果[数组]从Web服务(RPC)获取,那么你一定会得到一个错误,虽然它是成功的在数据库中执行和数组插入将失败..只需看看 链接Click Here你会得到你的回答

我只是改变conn.openAsync(db);conn.open(db);和它的工作

感谢

+0

注意,如果有大量数据要保存,openAsync()解决冻结应用程序的问题。更常见的是,像这样的错误发生:操作仍在执行。所以我认为这可能是一个问题,或者我错了。我从我的经历中了解到这一点。这很奇妙,没有解决这个问题的办法。我到处寻找如何为大型应用程序组织SQLite代码。我真的很失望。 – chrisiek

相关问题