我通过如下方法来获取表中long型字段的内容,但是最终获得的数据却不完整,只有前面部分的内容被取出来了????_RecordsetPtr rs(__uuidof(Recordset));
rs->Open(.....);_variant_t vt = rs->Fields->GetItem("MyLongData")->Value;比如说如果MyLongData的内容为“aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...”
通过上面的代码,vt中的数据却为“aaaaaaaaaaaaaaaaaaaaaa”有人遇到过这样的情况吗?
iType = vValue.vt;
if (iType == (VT_ARRAY | VT_UI1))
{
m_lpData = new char[uLength];
memset(m_lpData, 0, uLength);
char* pBufTemp = NULL;
SafeArrayAccessData(vValue.parray, (void **)&pBufTemp);
for (int i = 0; i < uLength; i++)
*(((char*)m_lpData)+i) = *(pBufTemp+i);
SafeArrayUnaccessData (vValue.parray);
m_lpData就是你要的数据
}
_variant_t varChunk;
UCHAR chData;
HRESULT hr;
long lBytesCopied = 0;lngSize = pField->ActualSize;
while(lngOffSet < lngSize)
{
try
{
varChunk = pField->GetChunk(100); //Copy the data only upto the Actual Size of Field.
for(long lIndex = 0; lIndex <= (100- 1); lIndex++)
{
hr= SafeArrayGetElement(varChunk.parray, &lIndex, &chData);
if(SUCCEEDED(hr))
{
((UCHAR*)lpData)[lBytesCopied] = chData;
lBytesCopied++;
}
else
break;
}
lngOffSet += ChunkSize;
}
catch(_com_error &e)
{
dump_com_error(e);
}
}
执行到varChunk = pField->GetChunk(100);后,通过跟踪,发现varChunk的vt仍为VT_BSTR
所以在这样的情况下,访问varChunk.parray还有意义吗?
WideCharToMultiBytes(CP_CAP,0,rs->Fields->GetItem("MyLongData")->Value.bstrVal,-1,szTemp,256, NULL,NULL);其中256可以改为你的字段的长度。