概述使用 SQLite3
访问Blob
字段 2012-06-13 18:47:19| 分类: 数据库 |字号 订阅 原文地址: http://blog.csdn.net/blueblood7/article/details/6576716 SQLite 是一个免费的文件型数据库。 1、 下载地址。 http://www.sqlite.org/download.html。 2、 编译。 C++ 使用 sqlite3 访问Blob字段 2012-06-13 18:47:19| 分类: 数据库 |字号 订阅 原文地址: http://blog.csdn.net/blueblood7/article/details/6576716 sqlite 是一个免费的文件型数据库。 1、 下载地址。 http://www.sqlite.org/download.HTML。 2、 编译。 C++: 建空的动态库或静态库,加入sqlite3.c,sqlite3.h和sqlite3ext.h,编译即可。 需注意的是动态库要把sqlite3.c 中的 #ifndef sqlITE_API # define sqlITE_API #endif 改为 #ifndef sqlITE_API # define sqlITE_API __declspec(dllexport) #endif 3、 建表。 包含字段 ID(图像ID,自增),filename(图像名),DATA(图像数据)。 BOol Ascii2Utf8(const char* pcszAscii,char* pszUtf8,int* pnUtf8Size) { if (!pcszAscii || !pszUtf8 || !pnUtf8Size) return FALSE; int nWCharCount = MultiBytetoWIDeChar(CP_ACP,pcszAscii,-1,NulL,0); wchar_t* pwszStr = new wchar_t[nWCharCount]; MultiBytetoWIDeChar(CP_ACP,pwszStr,nWCharCount); int nUtf8Count = WIDeCharToMultiByte(CP_UTF8,nWCharCount,NulL); if (nUtf8Count > *pnUtf8Size) { *pnUtf8Size = nUtf8Count; return FALSE; } WIDeCharToMultiByte(CP_UTF8,pszUtf8,nUtf8Count,NulL); delete[] pwszStr; *pnUtf8Size = nUtf8Count; return TRUE; } BOol Utf82Ascii(const char* pcszUtf8,char* pszAscii,int* pnAscIISize) { if (!pcszUtf8 || !pszAscii || !pnAscIISize) return FALSE; int nWCharCount = MultiBytetoWIDeChar(CP_UTF8,pcszUtf8,0); wchar_t* pwszStr = new wchar_t[nWCharCount]; MultiBytetoWIDeChar(CP_UTF8,nWCharCount); int nAsciiCount = WIDeCharToMultiByte(CP_ACP,NulL); if (nAsciiCount > *pnAscIISize) { *pnAscIISize = nAsciiCount; return FALSE; } WIDeCharToMultiByte(CP_ACP,pszAscii,nAsciiCount,NulL); delete[] pwszStr; *pnAscIISize = nAsciiCount; return TRUE; } BOol OpenDatabase(const char* pcszDBfilename,int nFlag,sqlite3** ppDb) { char szUtf8DBfilename[MAX_PATH]; int nSize = MAX_PATH; if (!Ascii2Utf8(pcszDBfilename,szUtf8DBfilename,&nSize)) return FALSE; sqlite3* pDb; int nRtn = sqlite3_open_v2(szUtf8DBfilename,&pDb,nFlag,NulL); if (nRtn != sqlITE_OK) return FALSE; *ppDb = pDb; return TRUE; } voID CDemoDlg::OnCreatetable() { // Todo: Add your control notification handler code here const char* pcszDBfilename = "d://测试中文//demo.db"; sqlite3* pDb; if (!OpenDatabase(pcszDBfilename,sqlITE_OPEN_READWRITE|sqlITE_OPEN_CREATE,&pDb)) return; const char* pcszsql = "create table images(ID integer primary key,filename varchar(50),DATA blob);"; char* pszErrorInfo = NulL; int nRtn = sqlite3_exec(pDb,pcszsql,&pszErrorInfo); if (nRtn != sqlITE_OK) { TRACE("sqlite3_exec error: %s/n",pszErrorInfo); sqlite3_free(pszErrorInfo); } sqlite3_close(pDb); return; } 4、 插入数据。 BYTE* GetfileData(const char* pcszfilename,int* pnfileLen) { file* fp = fopen(pcszfilename,"rb"); if (!fp) return NulL; fseek(fp,SEEK_END); int nfileLen = ftell(fp); fseek(fp,SEEK_SET); BYTE* pbyData = new BYTE[nfileLen]; if (!pbyData) { fclose(fp); return NulL; } fread(pbyData,nfileLen,1,fp); fclose(fp); if (pnfileLen) *pnfileLen = nfileLen; return pbyData; } voID FreefileData(voID* pData) { delete[] pData; } voID CDemoDlg::OnInsert() { // Todo: Add your control notification handler code here const char* pcszDBfilename = "d://测试中文//demo.db"; sqlite3* pDb; if (!OpenDatabase(pcszDBfilename,sqlITE_OPEN_READWRITE,&pDb)) return; const char* pcszfilename = "d://测试图片//图片1.jpg"; int nfileLen; BYTE* pbyData = GetfileData(pcszfilename,&nfileLen); if (!pbyData) return; char szsql[100]; sprintf(szsql,"insert into images values(NulL,'%s',?);",pcszfilename); char szUtf8sql[200]; int nSize = 200; if (!Ascii2Utf8(szsql,szUtf8sql,&nSize)) { FreefileData(pbyData); return; } sqlite3_stmt* pStmt = NulL; int nRtn = sqlite3_prepare_v2(pDb,&pStmt,NulL); if (nRtn == sqlITE_OK) { nRtn = sqlite3_bind_blob(pStmt,pbyData,NulL); if (nRtn == sqlITE_OK) { nRtn = sqlite3_step(pStmt); if (nRtn == sqlITE_DONE) { TRACE("insert succ!/n"); } } sqlite3_finalize(pStmt); } FreefileData(pbyData); sqlite3_close(pDb); return; } 5、 查询。 voID CDemoDlg::Onquery() { // Todo: Add your control notification handler code here const char* pcszDBfilename = "d://测试中文//demo.db"; sqlite3* pDb; if (!OpenDatabase(pcszDBfilename,sqlITE_OPEN_Readonly,&pDb)) return; const char* pcszsql = "select * from images;"; sqlite3_stmt* pStmt = NulL; int nRtn = sqlite3_prepare_v2(pDb,NulL); if (nRtn == sqlITE_OK) { nRtn = sqlite3_step(pStmt); while (nRtn == sqlITE_ROW) { int nID = sqlite3_column_int(pStmt,0); const char* pcszUtf8filename = (const char*)sqlite3_column_text(pStmt,1); char szfilename[MAX_PATH]; int nSize = MAX_PATH; Utf82Ascii(pcszUtf8filename,szfilename,&nSize); const BYTE* pbyData = (const BYTE*)sqlite3_column_blob(pStmt,2); int nDataLen = sqlite3_column_bytes(pStmt,2); TRACE("ID=%d,filename=%s,data len=%d/n",nID,nDataLen); char szNewfilename[MAX_PATH]; strcpy(szNewfilename,szfilename); char* pszExtension = strrchr(szNewfilename,'.'); *pszExtension = 0; strcat(szNewfilename,"__"); pszExtension = strrchr(szfilename,'.'); strcat(szNewfilename,pszExtension); file* fp = fopen(szNewfilename,"wb"); if (fp) { fwrite(pbyData,nDataLen,fp); fclose(fp); } nRtn = sqlite3_step(pStmt); } sqlite3_finalize(pStmt); } sqlite3_close(pDb); return; } 总结
以上是内存溢出为你收集整理的使用 SQLite3 访问Blob字段全部内容,希望文章能够帮你解决使用 SQLite3 访问Blob字段所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
评论列表(0条)