Click here to Skip to main content
15,881,882 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Please, this code keeps returning "SQLITE BUSY : Database is locked" even though I was not accessing it from another external thread or process and how can I resolve this?

The code uses CppSQLite3 C++ wrapper for SQLite.

C++
int DepartmentAccess::SaveOrDeleteAccess(long long iDeptNameID,long long &iUserID,int &iAccessTypeID)
{
	char szString[1000];
	char chAccessTypeID[1000];

	StringCbPrintfA(szString,sizeof(szString),"%d",iAccessTypeID);
	EncryptString(szString,chAccessTypeID);


	try
	{
		char szDatabaseFile[1000];
		GetDatabaseA(szDatabaseFile,sizeof(szDatabaseFile));
		
		CppSQLite3DB db;
		db.open(szDatabaseFile);

		CppSQLite3Statement stmt = db.compileStatement("SELECT AccessID FROM DepartmentAccess WHERE (InsututionID = ? AND DeptNameID = ? AND UserID = ? AND AccessType = ?)");
		stmt.bind(1,m_iInsututionID);
		stmt.bind(2,iDeptNameID);
		stmt.bind(3,iUserID);
		stmt.bind(4,chAccessTypeID);
		CppSQLite3Query q = stmt.execQuery();
		if(!q.fieldIsNull(0))
		{
			if(!m_iMode)
			{
				return -2;
			}
		}

		if(!m_iMode)
		{
			StringCbCopyA(szString,sizeof(szString),"INSERT INTO DepartmentAccess(InsututionID,DeptNameID,UserID,AccessType) VALUES(?,?,?,?)");
		}
		else
		{
			StringCbCopyA(szString,sizeof(szString),"DELETE FROM DepartmentAccess WHERE (InsututionID = ? AND DeptNameID = ? AND UserID = ? AND AccessType = ?)");
		}
		
		CppSQLite3Statement stmt1 = db.compileStatement(szString);
			
		int iPosition = 1;
		
		stmt1.bind(iPosition++, m_iInsututionID);
		stmt1.bind(iPosition++, iDeptNameID);
		stmt1.bind(iPosition++, iUserID);
		stmt1.bind(iPosition++, chAccessTypeID);
		//Execution gets to this point
		stmt1.execDML();
		//Execution fails to get to this point
		if(!m_iMode)
		{
			StringCbPrintfA(szString,sizeof(szString),"DELETE FROM DepartmentAccessRequest WHERE (InsututionID = ? AND DeptNameID = ? AND UserID = ? AND RequestedAccess = ?)");
			CppSQLite3Statement stmt2 = db.compileStatement(szString);
			int iPosition = 1;
		
			stmt2.bind(iPosition++, m_iInsututionID);
			stmt2.bind(iPosition++, iDeptNameID);
			stmt2.bind(iPosition++, iUserID);
			stmt2.bind(iPosition++, chAccessTypeID);

			stmt2.execDML();
		}
		return 1;
	}
	catch(CppSQLite3Exception & e)
    {
		char szString[200];
		StringCbPrintfA(szString,sizeof(szString),"Error Code: %d\n Error Mesage: %s",e.errorCode(),e.errorMessage());
        MessageBoxA(NULL,szString,"Save Or Delete Access Error(Department Access)",MB_OK);
	}

	return 0;
}
Posted
Updated 24-Aug-15 19:34pm
v2

1 solution

I do recommend to read this: 1.0 File Locking And Concurrency In SQLite Version 3[^]

The most common reason of SQlite busy error is that that some another process (or thread, etc) has a lock on a database. How to resolve that? Register A Callback To Handle SQLITE_BUSY Errors[^]
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900