Sqlite3批量写入数据到数据库中
2017-02-22 15:02
531 查看
1、创建或者打开数据库
int nResult = sqlite3_open(strDBPath.c_str(),&pDb);
if (SQLITE_OK != nResult)
{
sqlite3_close(pDb);
pDb = NULL;
AfxMessageBox("创建数据库文件失败!");
return pDb;
}2、创建数数据据库表,如果是打开就无需这一步的创建
4、准备插入
5、开始事务
6、为每一个字段绑定变量
for(int i = 0 ;i < num;i++)
7、执行/提交以上的事务(一次性批量的写入到数据库中,而不需要一条一条的)
strTrans = "commit transaction;";
nRet = sqlite3_exec(pDb, strTrans.c_str(), 0, 0, &errmsg);
if (nRet == SQLITE_OK)
{
nRet = sqlite3_changes(pDb);
}
else
{
sqlite3_finalize(stat); //把刚才分配的内容析构掉
sqlite3_close(pDb);
pDbM = NULL;
return;
}
sqlite3_finalize(stat); //把刚才分配的内容析构掉
sqlite3_close(pDb);
int nResult = sqlite3_open(strDBPath.c_str(),&pDb);
if (SQLITE_OK != nResult)
{
sqlite3_close(pDb);
pDb = NULL;
AfxMessageBox("创建数据库文件失败!");
return pDb;
}2、创建数数据据库表,如果是打开就无需这一步的创建
std::string strSQL = "create table T_AIS_GRID" "(ID NUMBER PRIMARY KEY," "MMSI VARCHAR2(20) not NULL," "CHANNEL VARCHAR2(1) not NULL," "GRIDX VARCHAR2(20) not NULL," "GRIDY VARCHAR2(20) not NULL," "LONGITUDE NUMBER," "LATITUDE NUMBER," "SPEED NUMBER," "HEADING NUMBER," "COURSE NUMBER," "TIME NUMBER," "DESTINATION VARCHAR2(20)," "NOTE VARCHAR2(100)" ")"; nResult = sqlite3_exec(pDb,strSQL.c_str(),NULL,NULL,&errmsg); if (SQLITE_OK != nResult) { sqlite3_close(pDb); pDb = NULL; AfxMessageBox("创建表失败!"); return pDb; }3、设置属性,比如内存大小、读写速度等
void SetAttributes(sqlite3*pDB) { std::string lstrSQL ; SYSTEM_INFO lsiSysInfo; TCHAR ltcBuf[MAX_PATH] ; GetSystemInfo(&lsiSysInfo); memset(ltcBuf,0,MAX_PATH) ; sprintf_s(ltcBuf,MAX_PATH,"PRAGMA page_size = %d;",lsiSysInfo.dwPageSize ); lstrSQL = ltcBuf ; Pragmas(pDB,lstrSQL); /** 设置页面计数*/ lstrSQL = "PRAGMA max_page_count = 1073741823 ;"; Pragmas(pDB,lstrSQL); /** 设置空间自动回收*/ lstrSQL = "PRAGMA auto_vacuum = 0;" ; Pragmas(pDB,lstrSQL); /** 设置本次打开的缓冲大小,对读写速度无太大影响*/ lstrSQL = "PRAGMA cache_size = 8192;" ; Pragmas(pDB,lstrSQL); /** 设置默认缓冲大小失败,对读写速度无太大影响*/ lstrSQL = "PRAGMA default_cache_size = 8192;" ; Pragmas(pDB,lstrSQL); /** 设置使用UTF8编码*/ lstrSQL = "PRAGMA encoding = 'UTF-8'; " ; Pragmas(pDB,lstrSQL);
}
bool Pragmas(sqlite3*pDB,std::string lstrCommands) { try { if(pDB) { std::string lstrSQL = lstrCommands ; if(sqlite3_exec(pDB ,ASCIItoUTF8(lstrSQL).c_str(), NULL, NULL, NULL) != SQLITE_OK ) { //ACE_ERROR((LM_ERROR,ACE_TEXT("[%D(%t)] Pragmas fail : %s\n"),lstrSQL.c_str())); } else { #ifdef PRAGMAS_QUERY sqlite3_stmt* lstmt ; const char* ltail ; lstrSQL = lstrCommands.substr(0,lstrCommands.find(_T("="))); lstrSQL += _T(";"); if(sqlite3_prepare(pDB,ASCIItoUTF8(lstrSQL).c_str(), -1, &lstmt, <ail) != SQLITE_OK) { //ACE_ERROR((LM_ERROR,ACE_TEXT("[%D(%t)] SQLite error:prepare sql failure:%s , error: %s\n"),lstrSQL.c_str(),sqlite3_errmsg(m_pDB))); } while(sqlite3_step(lstmt) == SQLITE_ROW) { if(sqlite3_column_count(lstmt) == 1) { //ACE_DEBUG((LM_DEBUG,ACE_TEXT("[%D(%t)] Set:%s Query:%s \n"),lstrCommands.c_str(), (char *)sqlite3_column_text(lstmt,0))) ; } } sqlite3_finalize(lstmt); #endif //ACE_DEBUG ((LM_DEBUG,"[%D(%t)] SQLite release memory: %.04fMB \n",sqlite3_release_memory((int)sqlite3_memory_highwater(true))/(1024*1024.f))); return true ; } } else { //ACE_ERROR((LM_ERROR,ACE_TEXT("[%D(%t)] Pragmas fail : SQLite db not open\n"))); } } catch(...) { //ACE_ERROR((LM_ERROR,ACE_TEXT("[%D(%t)] Exc pragma command exception: %s\n"),lstrCommands.c_str())); } return false ; }
4、准备插入
sqlite3_stmt * stat = NULL;
std::string strSQLG ="INSERT INTO T_AIS_GRID (ID,MMSI,CHANNEL,GRIDX,GRIDY,LONGITUDE,LATITUDE,SPEED,HEADING,COURSE,TIME,DESTINATION) VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9,?10,?11,?12)";//问号?代表这些字段的值目前为不确定的值,赋值在后面,数字表示第几个字段 int result =sqlite3_prepare_v2(pDb,strSQLG.c_str(),-1,&stat, NULL); if(result != SQLITE_OK ) { DWORD E = GetLastError(); sqlite3_reset(stat); sqlite3_close(pDb); pDbG = NULL; AfxMessageBox("数据插入失败!"); return; }
5、开始事务
std::string strTrans = "begin transaction;";//开始执行事务 int nRet = sqlite3_exec(pDb, strTrans.c_str(), 0, 0, &errmsg); if (nRet == SQLITE_OK) { nRet = sqlite3_changes(pDb); } else { sqlite3_finalize(stat); //把刚才分配的内容析构掉 sqlite3_close(pDb); pDb = NULL; return; }
6、为每一个字段绑定变量
for(int i = 0 ;i < num;i++)
{bind(stat,1, (int)(j+1)); bind(stat,2, (char*)strID.c_str()); bind(stat,3, (char*)strChannel.c_str()); bind(stat,4, (char*)strX.c_str()); bind(stat,5, (char*)strY.c_str()); bind(stat,6, (double)dLon); bind(stat,7, (double)dLat); bind(stat,8, (double)fSpeed); bind(stat,9, (double)fHeading); bind(stat,10, (double)fCourse); bind(stat,11,(__int64)i64CurTime); bind(stat,12,(char*)ASCIItoUTF8(strDes).c_str());
//bind(stat,14,(const UCHAR*)pBuf,totallength);//这个是对Blob字段进行插入,pBuf里面存入的是二进制
int result = sqlite3_step(stat);//返回101是执行成功 result = sqlite3_reset(stat);
}//中文字符需要转换成数据库要的格式UTF8
void bind(sqlite3_stmt * stat,int nParam, const char* szValue) { if (stat!=NULL) { int nRes = sqlite3_bind_text(stat, nParam, szValue, -1, SQLITE_TRANSIENT); if (nRes != SQLITE_OK) { return; } } } void bind(sqlite3_stmt * stat,int nParam, const int nValue) { if (stat!=NULL) { int nRes = sqlite3_bind_int(stat, nParam, nValue); if (nRes != SQLITE_OK) { return; } } } void bind(sqlite3_stmt * stat,int nParam, const __int64 llValue) { if (stat!=NULL) { int nRes = sqlite3_bind_int64(stat, nParam, llValue); if (nRes != SQLITE_OK) { return; } } } void bind(sqlite3_stmt * stat,int nParam, const double dValue) { if (stat!=NULL) { int nRes = sqlite3_bind_double(stat, nParam, dValue); if (nRes != SQLITE_OK) { return; } } } void bind(sqlite3_stmt * stat,int nParam, const unsigned char* blobValue, int nLen) { int nRes = sqlite3_bind_blob(stat, nParam,(const void*)blobValue, nLen, SQLITE_TRANSIENT); if (nRes != SQLITE_OK) { return; } }
7、执行/提交以上的事务(一次性批量的写入到数据库中,而不需要一条一条的)
strTrans = "commit transaction;";
nRet = sqlite3_exec(pDb, strTrans.c_str(), 0, 0, &errmsg);
if (nRet == SQLITE_OK)
{
nRet = sqlite3_changes(pDb);
}
else
{
sqlite3_finalize(stat); //把刚才分配的内容析构掉
sqlite3_close(pDb);
pDbM = NULL;
return;
}
sqlite3_finalize(stat); //把刚才分配的内容析构掉
sqlite3_close(pDb);
相关文章推荐
- sqlite工作记录-1数据库数据写入
- python读写sqlite3数据库并将统计数据写入excel
- Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
- sqlite工作记录-1数据库数据写入-转
- tushare数据写入SQLite 数据库
- SQLite数据库的数据读取和写入
- Android 操作数据库Sqlite,数据写入到SD卡里面
- 数据从文本文件写入数据库表的捷径
- IIS问题 将加密数据写入Web服务器配置数据库时出错
- 批量写数据---将XML数据批量写入数据库
- 使用ADO.NET2.0提升数据交互性能 使用SqlBulkCopy批量写入数据库
- 一个EXTJS与JSP连接把数据写入数据库的例子
- asp.net(c#)如何读取上传过程中的.txt文件中的数据,并将其写入数据库的
- spring+hibernate-struts数据写入SQL SERVER 2000数据库回滚
- 实现TEXTAREA数据写入数据库后提取出来原样显示在网页TABLE上并自动换行
- EDB数据库操作写入不了数据
- 从excel读数据写入数据库代码
- Javascript 将数据库中的数据写入WORD文档的表格中
- 何避免页面刷新数据重复写入数据库
- sql server 2005 中文件组的的概念及数据库文件因文件组满而无法写入的数据的解决方法