A simple but nice example can be found here.
Another very important and useful function is sqlite3_bind. Why do we need it?
Usually, though, it is not useful to evaluate exactly the same SQL statement more than once. More often, one wants to evalute similar statements. sqlite3_prepare_v2() can not only parse the state SQL statement, but also possible a SQL statement template, in which some parameters can be given later. The literals parameters are bound by the function sqlite3_bind. It is very flexible and efficient, because the SQL statement is need to be prepared only once and be used forever. In many SQL statements, the time needed to run sqlite3_prepare() equals or exceeds the time needed by sqlite3_step().
The following code is c++ class do a select sql operation, retrieving "File" according given "ID".
"select File from tb_image where ID=?1"
The parametrized SQL statement is prepared in constructor once using
SqlHandler::prepare_sql(const char* sql_in, sqlite3_stmt*& pStmt_in)
The image object can be retrieved with different id.bool SqlHandler::getRecipeHeaderImage( const int& imageId_in, QImage& image_out)
//-----------------------Example Code---------------------
static const char SQL_SELECT_HEADERIMAGE[]= "select File from tb_image where ID=?1";
SqlHandler::SqlHandler()
:bIsDBAvailable_(false)
,db_(0)
,pStmtHeaderImage_(0)
{
// Open the database
sqlite3_open(COKI_DB_FILE, &db_);
if( SQLITE_OK!=sqlite3_errcode(db_) )
{
qCritical("DB error: fail to open db file.");
sqlite3_close(db_);
return;
}
//prepare the SQL statement for select header info
if(!prepare_sql(SQL_SELECT_HEADERINFO, pStmtHeaderInfo_))
{
return;
}
SqlHandler::~SqlHandler()
{
sqlite3_finalize(pStmtHeaderImage_);
sqlite3_close(db_);
}
bool SqlHandler::isDBAvailable()
{
return bIsDBAvailable_;
}
bool SqlHandler::getRecipeHeaderImage( const int& imageId_in,
QImage& image_out)
{
if(!isDBAvailable())
{
return false;
}
// add id into sql statement
int iReturnCode = sqlite3_bind_int( pStmtHeaderImage_, 1, imageId_in);
if(iReturnCode != SQLITE_OK)
{
qCritical("Error: sqlite3_bind_in fails for ImageId = %d",imageId_in);
return false;
}
QString strFileName = COKI_IMAGE_DIR;
//execute the statement
iReturnCode = sqlite3_step( pStmtHeaderImage_ );
switch (iReturnCode )
{
case SQLITE_DONE:
return false;
break;
case SQLITE_ROW:
//load image
strFileName.append ((const char*)sqlite3_column_text( pStmtHeaderImage_, 0));
image_out.load(strFileName);
return true;
break;
default:
return false;
}
}
bool SqlHandler::prepare_sql(const char* sql_in, sqlite3_stmt*& pStmt_in)
{
if(sqlite3_prepare_v2(db_, sql_in, -1, &pStmt_in, 0))
{
sqlite3_finalize(pStmt_in);
return false;
}
return true;
}
No comments:
Post a Comment