描述:
我用VC6.0编写了一COM+,下面的函数是用来保存数据的。
STDMETHODIMP CDataAccess::PostTableRow(BSTR ATableName, BSTR AFieldName, BSTR AFieldValue, IUnknown ** ATableRowData)
{
try
{
_RecordsetPtr pRecordset;
pRecordset.CreateInstance(__uuidof(Recordset));
pRecordset.Attach((_Recordset *) *ATableRowData);
//SetConnect();
pRecordset->put_ActiveConnection(_variant_t(m_sConnStr));
pRecordset->UpdateBatch(adAffectAll);
m_spObjectContext->SetComplete();
pRecordset->put_ActiveConnection(vtMissing);
pRecordset->Close();
pRecordset.Release();
}
catch(_com_error * e)
{
e->ErrorMessage();
m_spObjectContext->SetAbort();
return S_FALSE;
}
return S_OK;
}
前端我用Delphi7.0编写并调用上面的方法,代码如下:
procedure TForm1.Button2Click(Sender: TObject);
var
IUser: IDataAccess;
vData: _Recordset;
begin
IUser := CoDataAccess.Create;
try
vData := ADODataSet1.Recordset;
try
IUser.PostTableRow('accFormulaMain', 'FormulaID', 'A999', IInterface(vData));
finally
vData := nil;
end;
finally
IUser := nil;
end;
end;
结果:数据能成功保存到数据库中,但是最后报错,错误信息为“内存分配访问无效”。本人百思不得其解,请高人分析!
解决方案1:
有了
pRecordset.Attach((_Recordset *) *ATableRowData);
完事之前要Detch
否则COM里release一次,delphi里又vData := nil; release一次