環境: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;