九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
SQLite數(shù)據(jù)庫(kù)如何存儲(chǔ)和讀取二進(jìn)制數(shù)據(jù) --SQLite 中文社區(qū)-- http://...
SQLite數(shù)據(jù)庫(kù)如何存儲(chǔ)和讀取二進(jìn)制數(shù)據(jù)
作者:葉開  來源:blog.csdn.net/hopestar2  時(shí)間:2009-3-11  【 字體: 】 〖 雙擊滾屏 〗

1.       存儲(chǔ)二進(jìn)制數(shù)據(jù)

 

       SQLite提供的綁定二進(jìn)制參數(shù)接口函數(shù)為:

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

   我們希望使用的是一套經(jīng)過封裝的COM接口,將上面這個(gè)函數(shù)封裝為COM接口的形式

BindParaByIndex( LONG index, VARIANT val);

   使用VARIANT變量來傳遞二進(jìn)制數(shù)據(jù),可以使用到它的一個(gè)SAFEARRAY指針,它保存了二進(jìn)制數(shù)據(jù)的地址和二進(jìn)制數(shù)據(jù)的字節(jié)長(zhǎng)度。

      在我們的COM接口中可以這樣進(jìn)行調(diào)用原始接口:

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

  構(gòu)造一個(gè)例子測(cè)試我們的接口:

    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;

   將五個(gè)字節(jié)的數(shù)據(jù)封裝到VARIANT變量中,然后調(diào)用相應(yīng)的接口,將它們存儲(chǔ)到數(shù)據(jù)庫(kù)中,然后

   調(diào)用下面的讀取二進(jìn)制接口,將數(shù)據(jù)讀取出來,看是否讀取的數(shù)據(jù)和存儲(chǔ)的數(shù)據(jù)一致.

 

2.       讀取二進(jìn)制數(shù)據(jù)

 

   讀取二進(jìn)制參數(shù)需要用到下面兩個(gè)SQLite提供的API

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

int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

    訪問也通過COM接口來實(shí)現(xiàn):

GetBlobData(LONG index, VARIANT* pval);

   如何將原始接口讀出來的數(shù)據(jù)封裝到VARIANT結(jié)構(gòu)中去呢,網(wǎng)上這方面的參考資料好少,差了不少資料,發(fā)現(xiàn)網(wǎng)上有不上SAFEARRAY的實(shí)現(xiàn)方案,但是我一一試了一下沒有一個(gè)可以將二進(jìn)制數(shù)讀入SAFEARRAY結(jié)構(gòu)的,Mentor我推薦了一個(gè)CcomSafeArray類,這個(gè)類成功實(shí)現(xiàn)了數(shù)據(jù)的存儲(chǔ)。

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,現(xiàn)在可以通過下面的代碼來測(cè)試是否成功讀取了所有的二進(jìn)制數(shù)據(jù)。測(cè)試代碼如下:

_variant_t val;

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

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;//測(cè)試結(jié)果為0x01,0x02,0x03,0x04,0x05

}

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
通過面向?qū)ο笤O(shè)計(jì)串口協(xié)議
Base64編碼
計(jì)算機(jī)基礎(chǔ)測(cè)試試題精選(一)
讀寫Access表中的圖像字段
學(xué)習(xí)單片機(jī)必須要知道的字節(jié)小知識(shí)
二進(jìn)制
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服