先检查是字段否存已经在,不存在再执行插入。
代码:
/**
* @brief 向sqlite数据表格中加入新字段(列)
* @param pSqlite3DB sqlite数据库对象
* @param pszTable 目标表格名字
* @param pszColumn 目标列名字
* @param pszType 目标列的类型
* @return 执行插入成功或目标表格中指定字段已经存在,则返回true,否则返回false
* @code
* 项task表格中加入整数列output。
* assert( AddTableColumn(pDB, "Task", "output", "integer") );
*
*/
bool AddTableColumn(
sqlite3* pSqlite3DB, const char* pszTable,
const char* pszColumn, const char* pszType )
{
assert(pSqlite3DB);
assert(pszTable);
assert(pszColumn);
assert(pszType);
if( !pSqlite3DB || !pszTable || !pszColumn || !pszType)
{
Log( "Add Table new Column failed: some of param are null" );
return false;
}
char szSql[256] = {0};
//检查表格中是否存在指定字段
sprintf( szSql,"select * from sqlite_master where name = '%s' and sql like '%%%s%%';",pszTable, pszColumn );
sqlite3_stmt *pStmt = NULL;
sqlite3_prepare( pSqlite3DB, szSql, -1, &pStmt, 0);
if( SQLITE_ROW == sqlite3_step(pStmt) )
{
// 已经存在,认为是成功
sqlite3_finalize(pStmt);
return true;
}
sqlite3_finalize(pStmt);
// 不存在尝试加入
sprintf_s( szSql, "alter table %s add %s %s null",pszTable,pszColumn,pszType );
int nResult = sqlite3_exec(pSqlite3DB, szSql ,NULL,NULL,NULL);
if (nResult != SQLITE_OK)
{ // 加入失败
Log("alter failed when add new column:%s", sqlite3_errstr(nResult) );
return false;
}
return true;
}