I'm trying to get my head around how to do a SQLite bulk insert using
transactions.  This works, but it doesn't make sense to re-create a new
SQLStatement in the loop:

private function onAddBulkContacts():void {
    _responder = new Responder(resultEventHandler, errorEventHandler);
    contacts_db.connection.begin(null, _responder);
    var statement:SQLStatement;

    for (var i:uint=0; i<parseInt(bulkAdd.numberToAdd.text); i++) {
     statement  = new SQLStatement();
    statement.sqlConnection = contacts_db.connection;
    statement.text ="INSERT INTO contacts ('name', 'lastname') VALUES
(@NAME, @LASTNAME)";

    statement.addEventListener(SQLErrorEvent.ERROR,
function(event:Event):void {
    trace('statement error');});
    statement.addEventListener(SQLEvent.RESULT, function(event:Event):void {
trace('result'); });
        statement.parameters['@NAME'] = "Name " + i.toString();
        statement.parameters['@LASTNAME'] = "LastName " + i.toString();
        statement.execute();
    }
    contacts_db.connection.commit();
}

What I want to do is create the SQLStatement once, let it compile, then just
pass in new arguments within the loop, the commit it at the end, e.g.

private function onAddBulkContacts():void {
    _responder = new Responder(resultEventHandler, errorEventHandler);
    contacts_db.connection.begin(null, _responder);
    var statement:SQLStatement;

    statement  = new SQLStatement();
    statement.sqlConnection = contacts_db.connection;
    statement.text ="INSERT INTO contacts ('name', 'lastname') VALUES
(@NAME, @LASTNAME)";

    statement.addEventListener(SQLErrorEvent.ERROR,
function(event:Event):void {
    trace('statement error');});
    statement.addEventListener(SQLEvent.RESULT, function(event:Event):void {
trace('result'); });

    for (var i:uint=0; i<parseInt(bulkAdd.numberToAdd.text); i++) {
        statement.parameters['@NAME'] = "Name " + i.toString();
        statement.parameters['@LASTNAME'] = "LastName " + i.toString();
        statement.execute();
    }
    contacts_db.connection.commit();
}

But the latter code throw an error saying that it can't execute the second
time through, since the statement itself is still executing (and I believe
will be in that state until the commit).  I guess I can understand that the
statements get added to the execution queue, but it doesn't make sense that
I have to add the SQL text within the loop, exactly the thing I'm trying to
avoid.  I'm sure there's a better way to do this, but I've spent way too
long hacking and reading trying to figure out what the proper sequence is.
Any ideas?

Thanks,

Tac

Reply via email to