Greetings all,

I imagine this has been covered before, but I've been through the archives and 
couldn't find what I needed.  So I'm appealing to a larger authority.

I am writing some C++ objects to handle access to a database.  Two of them are 
virtually identical: C_DAOService and C_DAOPerformer.  To test these classes, 
I've written some scaffolding that simply reads, writes and deletes from the 
tables using these classes.

The C_DAOService class works fine.  It gives me no problems.  But when I try to 
insert a row with the C_DAOPerformer class, I'm getting an "SQLITE_BUSY [5] 
database is locked" error.  And I don't know why.

I'm using SQLITE 3.0.7, and the CppSQLite3 wrapper code on a Windows XP home 
edition box.  I've never had any problems before this.  The C_DAOPerformer code 
in question is...


bool C_DAOPerformer::PerformerModify( performerinfoStruct pi, bool exists )
{
   bool retVal = true;
   bool commitOn = false;
   char tempsrvc[30];
   char *sqlinsert = "insert into performers ( active, useforfill, solosperqtr, 
ofersperqtr, preperqtr, postperqtr, performerid, fname, lname ) values ( ?, ?, 
?, ?, ?, ?, ?, ?, ? )";
   char *sqlupdate = "update performers set active = ?, useforfill = ?, 
solosperqtr = ?, ofersperqtr = ?, preperqtr = ?, postperqtr = ? where 
performerid = ?";
   char *sqlnewsrvc = "insert into performswhen( srvcid, performerid ) values ( 
?, ? )";
   char *sqldelsrvc = "delete from performswhen where srvcid = ? and 
performerid = ?";

  CppSQLite3DB db;

  try {
      CppSQLite3Statement stmt;

      cout << "C_DAOPerformer\tOpening Database\n";
      db.open(MMHDB);

      /*
      cout << "C_DAOPerformer\tBeginning Transaction\n";
      db.execDML("begin transaction");
      commitOn = true;
      */

      // ==========================================
      // Modify or insert a performer
      // ==========================================
      if ( exists ) {
       cout << "C_DAOPerformer\tCompiling Update Statement\n";
       stmt = db.compileStatement(sqlupdate);
      } else {
       cout << "C_DAOPerformer\tCompiling Insert Statement\n";
       stmt = db.compileStatement(sqlinsert);
      }

      cout << "C_DAOPerformer\tBinding values\n";
      stmt.bind(1, pi.iStatus);
      stmt.bind(2, pi.iUseForFill);
      stmt.bind(3, pi.iSolosPer);
      stmt.bind(4, pi.iOffertoriesPer);
      stmt.bind(5, pi.iPreludesPer);
      stmt.bind(6, pi.iPostludesPer);
      stmt.bind(7, pi.szIdCurr);

      if ( !exists ) {
       stmt.bind(8, pi.szFirstName);
       stmt.bind(9, pi.szLastName);
      }


      cout << "C_DAOPerformer\tExecuting DML\n";
      int rows = stmt.execDML();
      if ( rows == 0 )
       retVal = false;
      

      /*
      // ==========================================
      // Delete any services that are being removed
      // ==========================================
      cout << "C_DAOPerformer\tRemoving Services from performer\n";
      stmt = db.compileStatement(sqldelsrvc);
      for( UINT i = 0, j = pi.vSrvcDel.size(); i < j; i++ ) {
         strcpy( tempsrvc, pi.vSrvcDel[i].c_str() );
         stmt.bind(1, tempsrvc);
         stmt.bind(2, pi.szIdCurr);
         stmt.execDML();
         stmt.reset();
      }

      // ====================
      // Add any new services
      // ====================
      cout << "C_DAOPerformer\tAdding Services to performer\n";
      stmt = db.compileStatement(sqlnewsrvc);
      for( UINT i = 0, j = pi.vSrvcAdd.size(); i < j; i++ ) {
         strcpy( tempsrvc, pi.vSrvcAdd[i].c_str() );
         stmt.bind(1, tempsrvc);
         stmt.bind(2, pi.szIdCurr);
         stmt.execDML();
         stmt.reset();
      }
      */

      // ==============
      // Commit changes
      // ==============
      /*
      cout << "C_DAOPerformer\tCommitting transaction\n";
      db.execDML("commit transaction");
      commitOn = false;
      */

      cout << "C_DAOPerformer\tClosing database\n";
      db.close();

   } catch (CppSQLite3Exception& e) {
    if ( commitOn )
     db.execDML("rollback");

      char msg[300];
      sprintf( msg, "SQLite Error: (%i) %s", e.errorCode(), e.errorMessage() );
      MessageBox( GetActiveWindow(), msg, "Database Error", MB_OK | 
MB_ICONERROR );
      retVal = false;
   }

   return retVal;
}



When I execute this from the Command line, this is what I get.



T14.  Inserting record...
C_DTOPerformer::insertInfo()
C_DTOPerformer::insertInfo()    DAO Instance gotten
C_DAOPerformer  Opening Database
C_DAOPerformer  Compiling Insert Statement
C_DAOPerformer  Binding values
C_DAOPerformer  Executing DML
C_DTOPerformer::insertInfo()    DAO executed



The function gets as far as the Executing DML line, then it stops.  After some 
seconds, a message box appears with the error message in it.

Any ideas from anyone would be greatly appreciated.

TIA,

Paul

Reply via email to