如何实现ADO访问Blob类型

本文介绍了一个名为CDBMSSQL的类中两个关键方法:Load和Save的具体实现。Load方法用于从数据库加载指定ID的数据到缓冲区,而Save方法则将缓冲区中的数据保存到对应ID的数据库记录中。这两个方法通过使用_Recordset和_Connection对象来与数据库进行交互。

我把自己实际使用的代码贴出来供朋友参考

STDMETHODIMP CDBMSSQL::Load(long ID_Value, VARIANT *buf, short *pVal)
{
 _RecordsetPtr mRecordset;
 HRESULT hr;
 _bstr_t mStrSQL;

 hr = mRecordset.CreateInstance(__uuidof(Recordset));
 if(FAILED(hr))
 {
  *pVal = -1;
  return S_FALSE;
 }

 mStrSQL = " Select * From  Users where ID =";
 mStrSQL +=  (_bstr_t)ID_Value;
 

 pConnection = NULL;
 hr = pConnection.CreateInstance(__uuidof(Connection));

 if(FAILED(hr))
 {
  *pVal = (short) -1;
  return S_FALSE;
 }

 try
 {
  pConnection->Open(this->mConnectionString,"","",NULL);
 }
 catch(_com_error &e)
 {
  *pVal = (short) -2;
  return S_FALSE;
 }


 try
 {
  pConnection->put_CursorLocation(adUseClient);
  mRecordset->Open(mStrSQL,
   pConnection.GetInterfacePtr(),
   adOpenDynamic,
   adLockOptimistic,
   adCmdText);
 }
 catch(_com_error &e)
 {
  *pVal=(short)-3;
  return S_FALSE;
 }

 try
 {  
  short irow=mRecordset->RecordCount;

  if (irow == 1)
  {
   long size = mRecordset->Fields->GetItem(this->mSample_Field)->ActualSize;
   if (size==0)
   {
    *pVal = (short) -5;
    return S_FALSE;
   }

   long i = 0;
   int lIsRead=0;
   _variant_t varChunk;
   unsigned char  *buf1 = new unsigned char[size];
   long tmpsize = size;
   while(tmpsize>0)
   {
    lIsRead=tmpsize>=100? 100:tmpsize;
    varChunk = mRecordset->Fields->GetItem(this->mSample_Field)->GetChunk(lIsRead);
    for(long index=0;index<lIsRead;index++)
    {
     ::SafeArrayGetElement(varChunk.parray,&index,buf1+i*100+index);
    }

    tmpsize-=100;
    i++;
   }//while()

   SAFEARRAY *psa;
   SAFEARRAYBOUND rgsabound[1];
   rgsabound[0].cElements = size;
   rgsabound[0].lLbound = 0;
   psa = SafeArrayCreate(VT_UI1,1,rgsabound);
   
   for(i=0;i<size;i++)
   {
    SafeArrayPutElement(psa,&i,&(buf1[i]));
   }

   VARIANT data;
   data.vt = VT_ARRAY|VT_UI1;
   data.parray = psa;
   *buf = data;
   mRecordset->Close();

  }
  else
  {
   if(irow>1)
   {
    mRecordset->Close();
    *pVal = (short)-4;
    return S_FALSE;
   }
   else if(irow==0)
   {
    mRecordset->Close();
    *pVal =(short)-6;
    return S_FALSE;
   }
  }

 }
 catch(_com_error &e)
 {
  *pVal = (short) -99;
  return S_FALSE;
 }

 *pVal = (short)0;
 return S_OK;

 

STDMETHODIMP CDBMSSQL::Save(long ID_Value, VARIANT buf, short *pVal)
{
 _RecordsetPtr mRecordset;
 HRESULT hr;
 _bstr_t mStrSQL;

 hr = mRecordset.CreateInstance(__uuidof(Recordset));
 if(FAILED(hr))
 {
  *pVal = (short) -1;
  return S_FALSE;
 }

  mStrSQL = " Select * From  Users where ID ="; 
 mStrSQL += (_bstr_t)ID_Value;

 pConnection = NULL;
 hr = pConnection.CreateInstance(__uuidof(Connection));

 if(FAILED(hr))
 {
  *pVal = (short) -1;
  return S_FALSE;
 }

 try
 {
  pConnection->Open(this->mConnectionString,"","",NULL);
 }
 catch(_com_error &e)
 {
  *pVal = (short) -2;
  return S_FALSE;
 }

 try
 {
  pConnection->put_CursorLocation(adUseClient);
  mRecordset->Open(mStrSQL,
   pConnection.GetInterfacePtr(),
   adOpenDynamic,
   adLockOptimistic,
   adCmdText);
 }
 catch(_com_error &e)
 {
  *pVal=(short) -3;
  return S_FALSE;
 }

 try
 {
  short irow=mRecordset->RecordCount;
  
  switch(irow)
  {
   case 0:
    mRecordset->AddNew();
    mRecordset->Fields->GetItem(this->mID_Field)->Value = ID_Value;
    mRecordset->Fields->GetItem(this->mSample_Field)->AppendChunk(buf);
    mRecordset->Update();
    mRecordset->Close();
    
    break;
   case 1:
    mRecordset->Fields->GetItem(this->mSample_Field)->AppendChunk(buf);

    mRecordset->Update();
    mRecordset->Close();  
    break;
   default:
    *pVal = (short) -4;
    return S_FALSE;
    break;
  }

 }
 catch(_com_error &e)
 {
  *pVal = (short) -99;
  return S_FALSE;
 }
/**/
 *pVal = (short)0;
 return S_OK;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值