/*
程式功能: 使用SQLite的C API操作SQLite資料庫,存取二進位資料.
用來測試的檔都小於65535位元組,沒有測試更大的檔!
參考文檔: http://www.cntxk.com/CataNews/56/info8106.html
編譯環境: codeblock 10.05(svn 6906)
*/
#include <stdio.h>
#include <memory.h>
#include <sqlite3.h>int main(int argc,char *argv[])
{
sqlite3* pDB=NULL;
char* pErrMsg; if(SQLITE_OK==sqlite3_open("./mydb.db",&pDB))
{
sqlite3_exec(pDB,"create table bList(fileName varchar(16) primary key, binData blob);",NULL,NULL,&pErrMsg);
{
char buffer[65535];
int iLen=0;
sqlite3_stmt* stmt; {//存儲二進位資料
unsigned char hex[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
sqlite3_prepare(pDB,"insert into bList values ('hex',?);",-1,&stmt,NULL);
sqlite3_bind_blob(stmt,1,hex,16,NULL);
sqlite3_step(stmt);
} stmt=NULL;
{//存儲exe檔
memset(buffer,0,65535);
{
FILE* fp=fopen(argv[0],"rb");
iLen=fread(buffer,1,65535,fp);
fclose(fp);
}
sqlite3_prepare(pDB,"insert into bList values ('me.exe',?);",-1,&stmt,NULL);
sqlite3_bind_blob(stmt,1,buffer,iLen,NULL);
sqlite3_step(stmt);
} stmt=NULL;
{//存儲普通c文檔
memset(buffer,0,65535);
{
FILE* fp=fopen("../main.c","rb");
iLen=fread(buffer,1,65535,fp);
fclose(fp);
}
sqlite3_prepare(pDB,"insert into bList values ('main.txt',?);",-1,&stmt,NULL);
sqlite3_bind_blob(stmt,1,buffer,iLen,NULL);
sqlite3_step(stmt);
}
stmt=NULL;
{//從資料庫中讀取txt檔資料
char *data=NULL;
memset(buffer,0,65535);
sqlite3_prepare(pDB, "select binData from bList where fileName='main.txt';", -1, &stmt, 0);
sqlite3_step(stmt);
data= (char *)sqlite3_column_blob(stmt,0);//得到紀錄中的BLOB欄位
iLen= sqlite3_column_bytes(stmt, 0);//得到欄位中資料的長度
memmove(buffer,data,iLen);
printf("%s\n",buffer);
}
}
sqlite3_close(pDB);
} {
puts("Press any key to exit...");
getchar();
}
return 0;
}
創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()