使用 SQLite3 访问Blob字段
发布时间:2020-12-12 20:19:22 所属栏目:百科 来源:网络整理
导读:使用 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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |