日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQLite数据库如何存储和读取二进制数据

發布時間:2023/12/9 数据库 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQLite数据库如何存储和读取二进制数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.?????? 存儲二進制數據

?

?????? SQLite提供的綁定二進制參數接口函數為:

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

?? 我們希望使用的是一套經過封裝的COM接口,將上面這個函數封裝為COM接口的形式

BindParaByIndex( LONG index, VARIANT val);

?? 使用VARIANT變量來傳遞二進制數據,可以使用到它的一個SAFEARRAY指針,它保存了二進制數據的地址和二進制數據的字節長度。

????? 在我們的COM接口中可以這樣進行調用原始接口:

Sqlite3_bind_blob(m_pStmt, val.parray, val.parray->rsground->cElement,SQLITE_TRANSIENT);

? 構造一個例子測試我們的接口:

??? BYTE Data[] = {0x01,0x02,0x03,0x04,0x05};

??? CComSafeArray<byte> *pcsfa;

??? CComSafeArrayBound bound[1];

??? bound[0].SetCount(5);

??? bound[0].SetLowerBound(0);

??? pcsfa = new CComSafeArray<byte>(bound,1);

??? for(LONG i = 0; i <(LONG)5; i++)

??? {

??????? HRESULT hr = pcsfa->SetAt(i,Data[i]);

??? }

??? _variant_t variant;

??? variant.vt = VT_ARRAY | VT_UI1;

??? variant.parray = pcsfa->m_psa;

?? 將五個字節的數據封裝到VARIANT變量中,然后調用相應的接口,將它們存儲到數據庫中,然后

?? 調用下面的讀取二進制接口,將數據讀取出來,看是否讀取的數據和存儲的數據一致.

?

2.?????? 讀取二進制數據

?

?? 讀取二進制參數需要用到下面兩個SQLite提供的API:

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);

int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

??? 訪問也通過COM接口來實現:

GetBlobData(LONG index, VARIANT* pval);

?? 如何將原始接口讀出來的數據封裝到VARIANT結構中去呢,網上這方面的參考資料好少,差了不少資料,發現網上有不上SAFEARRAY的實現方案,但是我一一試了一下沒有一個可以將二進制數讀入SAFEARRAY結構的,Mentor給我推薦了一個CcomSafeArray類,這個類成功實現了數據的存儲。

CComVariant cVal;

int nLen = sqlite3_column_bytes(m_pStmt,nIndex);

const void* pcvData = (const void*)sqlite3_column_blob(m_pStmt,nIndex);

BYTE* pData = new BYTE[nLen];

memcpy(pData,pcvData,nLen);

CComSafeArray<byte> *pcsfa;

CComSafeArrayBound bound[1];

bound[0].SetCount(nLen);

bound[0].SetLowerBound(0);

pcsfa = new CComSafeArray<byte>(bound,1);

for(LONG i = 0; i <(LONG)nLen; i++)

{

HRESULT hr = pcsfa->SetAt(i,pData[i]);

}

cVal = pcsfa->m_psa;

cVal.vt = VT_ARRAY | VT_UI1;

delete pData;

cVal.Detach(pVal);

?? OK,現在可以通過下面的代碼來測試是否成功讀取了所有的二進制數據。測試代碼如下:

_variant_t val;

val = GetBlobData(nIndex); //nIndex表示BLOB類型數據的索引值

byte buf[5];

if(val.vt == (VT_UI1|VT_ARRAY))

{

for(LONG index = 0; index < 5; index++)

{

??? ::SafeArrayGetElement(val.parray,&index,buf+index);

}

}

for(int j = 0; j < 5; j++)

{

cout << “0x” << hex <<(int) buf[j]<<endl;//測試結果為0x01,0x02,0x03,0x04,0x05

}

轉載于:https://www.cnblogs.com/top5/archive/2009/11/26/1611479.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的SQLite数据库如何存储和读取二进制数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。