使用SQLite数据库存取mp3和图片等二进制数据

使用SQLite数据库存取mp3和图片等二进制数据,第1张

概述  源代码说话吧:     CString sql1 = "create table if not exists picture(id integer, pic blob)";    CString sql2 = L"insert into picture(id, pic)values(:id,:pic)";    CString sql3 = L"select * from picture";

源代码说话吧:

CString sql1 = "create table if not exists picture(ID integer,pic blob)";
CString sql2 = L"insert into picture(ID,pic)values(:ID,:pic)";
CString sql3 = L"select * from picture";
pDB->BeginTrans();
pDB->Execute(_bstr_t(sql1));
pDB->CommitTrans();


file *fp;
LONG lfileSize = 0;
byte* picBuffer;
fp = fopen("./src.wma","rb");
if(NulL != fp)
{
fseek(fp,SEEK_END);
lfileSize = ftell(fp);
fseek(fp,SEEK_SET);
picBuffer = new byte[lfileSize];
size_t sz = fread(picBuffer,sizeof(byte),lfileSize,fp);
fclose(fp);
}

CComSafeArray<byte> *pcsfa;
CComSafeArrayBound bound[1];
bound[0].SetCount(lfileSize);
bound[0].SetLowerBound(0);
pcsfa = new CComSafeArray<byte>(bound,1);
for(LONG i = 0; i <(LONG)lfileSize; i++)
{
HRESulT hr = pcsfa->SetAt(i,picBuffer[i]);
}

_variant_t variant;
variant.vt = VT_ARRAY | VT_UI1;
variant.parray = pcsfa->m_psa;

ISDKCommandPtr pCommand;
pCommand = pDB->CreateCommand();
pCommand->PrepareCommand(_bstr_t(sql2));
pCommand->BindParaByIndex(0,_variant_t(::GetCurrentThreadID()));
pCommand->BindParaByIndex(1,variant);
pCommand->Execute();

ISDKResultSetPtr pResultSet;
pResultSet = pDB->Execute(_bstr_t(sql3));
cout << pResultSet->GetFIEldCount() << endl;
cout << pResultSet->GetFIEldname(1) << endl;

while(pResultSet->IsValIDRow())
{
_variant_t val;
val = pResultSet->GetFIEldValueByIndex(0);
int nID = val.lVal;
VariantClear(&val);

val = pResultSet->GetFIEldValueByname(_bstr_t(L"pic"));
LONG lfileSize2 = val.parray->rgsabound->cElements;
byte* buf = new byte[lfileSize2];
if(val.vt == (VT_UI1|VT_ARRAY))
{
for(LONG index = 0; index < lfileSize2; index++)
{
::SafeArrayGetElement(val.parray,&index,buf+index);
}
}
file *fp2;
fp2 = fopen("dest.wma","wb");
if(NulL != fp2)
{
size_t ret = fwrite(buf,lfileSize2,fp2);
fclose(fp2);
}
delete[] buf;
cout << endl;
VariantClear(&val);

pResultSet->Next();
}
delete[] picBuffer;

下面的是原始的API接口存取图片的示例代码:

sqlite3 *db;
sqlite3_stmt *stat,*stat2;
char *zErrMsg = 0;
file *fp = NulL;
long filesize = 0;
char * ffile = NulL;
char *buf = NulL;

sqlite3_open("pic.db",&db);
if(db == NulL)
{
return -1;
}

fp = fopen("inpic.jpg","rb");
if(fp != NulL)
{
fseek(fp,SEEK_END);
filesize = ftell(fp);
fseek(fp,SEEK_SET);

ffile = new char[filesize];
size_t sz = fread(ffile,sizeof(char),filesize,fp);

fclose(fp);
}

sqlite3_exec(db,"create table pic (flIEname varchar(128) unique,pic blob);",&zErrMsg);
sqlite3_prepare(db,"insert into pic values ('inpic.jpg',?)",-1,&stat,0);
sqlite3_bind_blob(stat,1,ffile,NulL);
sqlite3_step(stat);

sqlite3_prepare(db,"select * from pic",&stat2,0);
sqlite3_step(stat2);
const voID * picdata = sqlite3_column_blob(stat2,1);
int size = sqlite3_column_bytes(stat2,1);
buf = new char[size];
sprintf(buf,"%s",picdata);

file*fp2;
fp2 = fopen("outpic.jpg","wb");
if(fp2 != NulL)
{
size_t ret = fwrite(picdata,size,fp2);
fclose(fp2);
}

delete[] ffile;sqlite3_finalize(stat);sqlite3_finalize(stat2);sqlite3_close(db);

总结

以上是内存溢出为你收集整理的使用SQLite数据库存取mp3和图片等二进制数据全部内容,希望文章能够帮你解决使用SQLite数据库存取mp3和图片等二进制数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178255.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存