2009-10-28 4 views
0

나는 csv 파일을 배열로 구문 분석하고 배열을 sqlite 데이터베이스에 삽입하는 응용 프로그램을 작성 중입니다. sqlite 데이터베이스에 비동기 연결 문제가 있는데, 3106 오류가 발생합니다. 문제는 이전 문이 끝나기 전에 다음 문을 실행하지만 처리 방법을 찾을 수 없다고 생각합니다. 이. 어떤 도움이라도 대단히 감사하겠습니다. 당신은 문제가 여전히 실행되는 것을 생각하면플렉스/에어 sqlite 비동기 문제

public function addData(categories:Array):void{ 
       status = "Adding data to table"; 
       var insrtStmt:SQLStatement = new SQLStatement(); 
        insrtStmt.sqlConnection = conn; 


         for(var i:int=categories.length-1; i>=0; i--){ 
          insrtStmt.text = ""; 
          insrtStmt.text += "INSERT INTO masterlist "; 
          insrtStmt.text += "(mainid, transactionDate, tradeId, ccyPair, account, buySell, customer, date,"; 
          insrtStmt.text += " additionalid, dealType, traderName, genericType, owner) "; 
          insrtStmt.text += "VALUES(@mainid, @transactionDate, @tradeId, @ccyPair, @account, @buySell, @customer, @date,"; 
          insrtStmt.text += " @additionalid, @dealType, @traderName, @genericType, @owner);"; 
          insrtStmt.parameters["@mainid"] = categories[i].mainid; 
          insrtStmt.parameters["@transactionDate"] = categories[i].transactionDate; 
          insrtStmt.parameters["@tradeId"] = categories[i].tradeId; 
          insrtStmt.parameters["@ccyPair"] = categories[i].ccyPair; 
          insrtStmt.parameters["@account"] = categories[i].account; 
          insrtStmt.parameters["@buySell"] = categories[i].buySell; 
          insrtStmt.parameters["@customer"] = categories[i].customer; 
          insrtStmt.parameters["@date"] = categories[i].date; 
          insrtStmt.parameters["@additionalid"] = categories[i].additionalid; 
          insrtStmt.parameters["@dealType"] = categories[i].dealType; 
          insrtStmt.parameters["@traderName"] = categories[i].traderName; 
          insrtStmt.parameters["@genericType"] = categories[i].genericType; 
          insrtStmt.parameters["@owner"] = categories[i].owner; 
          insrtStmt.execute(); 
          } 

       } 

답변

1

, 그것은 "결과"이벤트의 대한 바로 문에 이벤트 리스너를 추가하고 다음 문을 해고.

public function addDataSet(categories : Array) : void { 
    _categories = categories; 
    _loopcounter = categories.length; 
    _insrtStmt : SQLStatement = new SQLStatement(); 
    _insrtStmt.addEventListener("result", addData); 
    addData(); 
} 

public function addData(event : Event = null) : void { 
    _loopcounter--; 
    // Set up rest of statement 
    _insrtStmt.execute(); 
} 
+1

이벤트를 기다리는 루프는 절대로 사용하지 마십시오. – sharvey

+0

나는 다른 한편으로는 ... 혀를 뺨에 충분히 말하지 않았습니까? ;) 나는 그것을 편집 할 것이다 ... –

0

아마도 비동기 연결 대신 동기 연결을 사용해야합니까? 필요한 경우 동일한 db에 대해 여러 연결을 열어 적절한 연결을 사용할 수 있습니다.

0

여러 명령을 한 번에 실행하는 경우 - 트랜잭션을 사용하십시오.

간단한 예를 http://www.zedia.net/2009/air-sqlite-optimization-tricks/

_updateStmt.sqlConnection = _conn; 
_updateStmt.text = "UPDATE main.myTable SET [email protected] WHERE [email protected]"; 

_conn.begin();//_conn is a SQLConnection, I didn't take the time to write the code for it, but this is where the magic happens 

for (var i:uint = 0; i < currentArray.length; i++){ 
    _updateStmt.parameters["@STATUS"] = currentArray[i].status; 
    _updateStmt.parameters["@ID"] = currentArray[i].id; 
    _updateStmt.execute(); 
} 

_conn.commit(); 

또한

0

'데이터베이스 성능 향상'장 LiveDocs의 어도비 플렉스를 보라 아니면 각 쿼리에 대해 당신이 돈 '그런 식으로 새로운의 SQLStatement을 만들 수에서 기다릴 필요가 없으므로 클라이언트 컴퓨터가 처리 할 수있는만큼 빠르게 삽입을 시작할 수 있습니다.

public function addData(categories:Array):void { 
    status = "Adding data to table"; 
    var insrtStmt:SQLStatement; 

    for(var i:int=categories.length-1; i>=0; i--) { 
     insrtStmt = new SQLStatement(); 
     insrtStmt.sqlConnection = conn; 
     insrtStmt.text = ""; 
     insrtStmt.text += "INSERT INTO masterlist "; 
     insrtStmt.text += "(mainid, transactionDate, tradeId, ccyPair, account, buySell, customer, date,"; 
     insrtStmt.text += " additionalid, dealType, traderName, genericType, owner) "; 
     insrtStmt.text += "VALUES(@mainid, @transactionDate, @tradeId, @ccyPair, @account, @buySell, @customer, @date,"; 
     insrtStmt.text += " @additionalid, @dealType, @traderName, @genericType, @owner);"; 
     insrtStmt.parameters["@mainid"] = categories[i].mainid; 
     insrtStmt.parameters["@transactionDate"] = categories[i].transactionDate; 
     insrtStmt.parameters["@tradeId"] = categories[i].tradeId; 
     insrtStmt.parameters["@ccyPair"] = categories[i].ccyPair; 
     insrtStmt.parameters["@account"] = categories[i].account; 
     insrtStmt.parameters["@buySell"] = categories[i].buySell; 
     insrtStmt.parameters["@customer"] = categories[i].customer; 
     insrtStmt.parameters["@date"] = categories[i].date; 
     insrtStmt.parameters["@additionalid"] = categories[i].additionalid; 
     insrtStmt.parameters["@dealType"] = categories[i].dealType; 
     insrtStmt.parameters["@traderName"] = categories[i].traderName; 
     insrtStmt.parameters["@genericType"] = categories[i].genericType; 
     insrtStmt.parameters["@owner"] = categories[i].owner; 
     insrtStmt.execute(); 
    } 
}