我把自己实际使用的代码贴出来供朋友参考
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;
}
本文介绍了一个名为CDBMSSQL的类中两个关键方法:Load和Save的具体实现。Load方法用于从数据库加载指定ID的数据到缓冲区,而Save方法则将缓冲区中的数据保存到对应ID的数据库记录中。这两个方法通过使用_Recordset和_Connection对象来与数据库进行交互。
933

被折叠的 条评论
为什么被折叠?



