ADO存取图片到SQL SERVER数据库时遇到的有关问题
ADO存取图片到SQL SERVER数据库时遇到的问题
代码如下,前一段为存,后一段为取,存正常,取出错.
另外,还有几个顺带的问题,1.AppendChunk,GetChunk是不是对所操作的字段的类型有要求,必须是text或image类型?我本来是想用这两方法来对所有类型进行操作的, 试了下,好象别的类型不行.2.另外,C++中类的公共成员,保护成员,私有成员命名时,前缀是什么,这个好象在哪里看过,忘了,也不知道是哪门语言上的,知道的也顺便说下
3.我在用ADO操作的时候,以前用catch(_com_err e)这样捕捉,好象连一般的打开记录集Open出错时,都不会抛出,于是后来就一直用catch(...),不过,现在不知道怎么把错误码或详细信息读出来,在catch中用GetLastError好象不行,知道怎么用的也说下,谢谢
try
{
lstate = m_pRecordset-> State;
if(lstate == adStateOpen)
m_pRecordset-> Close();
m_pRecordset-> Open((_bstr_t)szCommand,
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
Fields *pFields = m_pRecordset-> GetFields();
Field *pField = pFields-> GetItem( "other3 ");
CFile imagefile;
if(0 == imagefile.Open( "C:\\WINNT\\Blue Lace 16.bmp ",CFile::modeRead))
return;
long nLength = imagefile.GetLength();
BYTE *pbuf = NULL;
BYTE *pBufEx = NULL;
//存
pbuf = new BYTE[nLength];
pBufEx = pbuf;
if(pbuf == NULL)
return; //allocate memory error;
imagefile.Read(pbuf,nLength); //read the file into memory
//build a SAFFERRAY
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long j = 0; j < nLength; j++)
SafeArrayPutElement (psa, &j, pBufEx++);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
pField-> AppendChunk(varBLOB);
delete []pbuf;
//取
VARIANT varBLOB2;
pField-> get_ActualSize(&nLenth); //这里取出来的长度和上面存入的长度一致
varBLOB2 = pField-> GetChunk(nLenth); //运行到这句的时候,异常抛出.
if(varBLOB2.vt == (VT_ARRAY | VT_UI1))
{
pbuf = (BYTE*)GlobalAlloc(GMEM_FIXED,nLenth);
SafeArrayAccessData(varBLOB2.parray,(void **)pbuf);
//Build a File in Windows Temp Directory
char tmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);
代码如下,前一段为存,后一段为取,存正常,取出错.
另外,还有几个顺带的问题,1.AppendChunk,GetChunk是不是对所操作的字段的类型有要求,必须是text或image类型?我本来是想用这两方法来对所有类型进行操作的, 试了下,好象别的类型不行.2.另外,C++中类的公共成员,保护成员,私有成员命名时,前缀是什么,这个好象在哪里看过,忘了,也不知道是哪门语言上的,知道的也顺便说下
3.我在用ADO操作的时候,以前用catch(_com_err e)这样捕捉,好象连一般的打开记录集Open出错时,都不会抛出,于是后来就一直用catch(...),不过,现在不知道怎么把错误码或详细信息读出来,在catch中用GetLastError好象不行,知道怎么用的也说下,谢谢
try
{
lstate = m_pRecordset-> State;
if(lstate == adStateOpen)
m_pRecordset-> Close();
m_pRecordset-> Open((_bstr_t)szCommand,
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
Fields *pFields = m_pRecordset-> GetFields();
Field *pField = pFields-> GetItem( "other3 ");
CFile imagefile;
if(0 == imagefile.Open( "C:\\WINNT\\Blue Lace 16.bmp ",CFile::modeRead))
return;
long nLength = imagefile.GetLength();
BYTE *pbuf = NULL;
BYTE *pBufEx = NULL;
//存
pbuf = new BYTE[nLength];
pBufEx = pbuf;
if(pbuf == NULL)
return; //allocate memory error;
imagefile.Read(pbuf,nLength); //read the file into memory
//build a SAFFERRAY
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long j = 0; j < nLength; j++)
SafeArrayPutElement (psa, &j, pBufEx++);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
pField-> AppendChunk(varBLOB);
delete []pbuf;
//取
VARIANT varBLOB2;
pField-> get_ActualSize(&nLenth); //这里取出来的长度和上面存入的长度一致
varBLOB2 = pField-> GetChunk(nLenth); //运行到这句的时候,异常抛出.
if(varBLOB2.vt == (VT_ARRAY | VT_UI1))
{
pbuf = (BYTE*)GlobalAlloc(GMEM_FIXED,nLenth);
SafeArrayAccessData(varBLOB2.parray,(void **)pbuf);
//Build a File in Windows Temp Directory
char tmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);