ADO寫二進制數據時的注意事項

環境:VS2008  MFC msado15.dll   SQL Server 2000   SQL Server 2005


操作SQL Server 2000時需要注意若要使用AppendChunk()函數,則必須要將Field對象的屬性Attributes設爲adFldLong,否則將會出現“在此環境中不允許操作”的錯誤;然而在操作SQL Server 2005時則在使用AppendChunk()不顯式設置adFldLong時也不會出現上述的錯誤,也許是2005內默認adFldLong已設置了而2000的沒有(這只是我的猜測);
若不使用AppendChunk(),可以使用流對象ADODB::Stream。使用Stream對象時,還需注意當把_variant_t 變量寫入Stream內

pstream->Write(var);          //pstream爲ADODB::_StreamPtr,    var爲_variant_t
後需將流stream的位置設爲起始位置0,
pstream->Position=0;

因爲write後position是在stream的末尾,這樣當你Read流Stream的內容時是從末尾讀起,此時讀到的內容就是NULL
pstream->Read(size);      //size爲需讀取的字節數
使用流Stream時無需考慮是2000還是2005。

以下是代碼:(偷懶,然後把所以判斷是否出錯的語句都省略了)


CoInitialize(NULL);
ADODB::_ConnectionPtr pconnect=NULL;
pconnect.CreateInstance(__uuidof(ADODB::Connection));

_bstr_t strcon="Provider=SQLOLEDB;Server=10.10.1.54,1433;Database=database;uid=test;pwd=test";
pconnect->open(strcon,"","",NULL);

ADODB::_Recordset record=NULL;
record.CreateInstance(__uuidof(ADODB::Recordset));
record->open("test",(IDispatch *)pconnect,ADODB::adOpenDynamic,ADODB::adLockPessimistic,ADODB::adCmdUnspecified);

SAFEARRAYBOUND bounds[1];
int n=20;
bounds[0].cElements=n*4;		//假設我存儲的數據是浮點數float, n爲數據的個數, *4是因爲float佔4個字節, 若是double則*8
bounds[0].lLbound=0;
CComSafeArray<byte> darray(bounds,1);
float *data=(float *)darray.m_psa->pvData;
for(int i=0;i!=n;++i)
	data[i]=10.0F;

_variant_t var;
var.vt=VT_ARRAY|VT_UI1;
var.parray=darray;

_variant_t varoption(DISP_E_PARAMNOTFOUND,VT_ERROR);
ADODB::_StreamPtr pstream=NULL;
pstream.CreateInstance(__uuidof(ADODB::Stream));
pstream->Type=ADODB::adTypeBinary;
pstream->Open(varoption,ADODB::adModeUnknown,ADODB::adOpenStreamUnspecified,"","");
pstream->Write(var);
pstream->Position=0;

record->AddNew();
record->Fields->Item["value"]->Value=pstream->Read(bounds[0].cElements);
record->Update();

pstream->Close();
record->Close();
pconnect->Close();



PS: 讀取二進制內容時要獲取其實際大小可用方法

long size=record->Fields->Item["value"]->ActualSize;


發佈了16 篇原創文章 · 獲贊 2 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章