给你一段不完整的代码.
Delphi端不管了,很简单的。
VC:
HRESULT Cdb_emp::Activate()
{
    HRESULT hr = S_OK;
    try
{
ErrMessage = L"";
pObjADO_Connection.CreateInstance (__uuidof(Connection));
// bstr_t strConnect = L"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = E:\\Code\\VC\\ComClient\\evaluate.mdb";
bstr_t strConnect = L"Provider = Microsoft.Jet.OLEDB.4.0;Data Source = E:\\Code\\Evaluate\\Market\\evaluate.mdb";
hr = pObjADO_Connection->Open(strConnect,(BSTR)NULL,(BSTR)NULL,-1); 
if (FAILED(hr))
{
ErrMessage = L"Connect Failed";
return hr;
}
}
catch(...)
{
return hr;
}
hr = GetObjectContext(&m_spObjectContext);
if (SUCCEEDED(hr))
{
return S_OK;
}
return hr;
} BOOL Cdb_emp::CanBePooled()
{
return TRUE;
} void Cdb_emp::Deactivate()
{
m_spObjectContext.Release();
try
{
pObjADO_Connection->Close();
}
catch(...)
{
;
}

STDMETHODIMP Cdb_emp::AddEmp(BSTR EmpNO, BSTR Name)
{
// TODO: Add your implementation code here
    HRESULT hr = S_OK;

try
{
ErrMessage = L"Insert Start";
bstr_t strSQLStmt = L"Insert Into Emp(EmpNo,EName) Values(";
strSQLStmt = strSQLStmt + (bstr_t)EmpNO;
        strSQLStmt = strSQLStmt + L",'";
strSQLStmt = strSQLStmt + (bstr_t)Name;
strSQLStmt = strSQLStmt + L"')"; variant_t vntRecordsAffected; pObjADO_Connection->Execute (strSQLStmt,&vntRecordsAffected,adCmdText);
if (m_spObjectContext)
m_spObjectContext->SetComplete ();
}
catch(_com_error &e)
{
ErrMessage = L"Insert Failed";
if (m_spObjectContext)
m_spObjectContext->SetAbort ();
}
return hr;
}STDMETHODIMP Cdb_emp::GetByNo(BSTR EmpNo, LPDISPATCH *ppRecordset)
{
// TODO: Add your implementation code here
    HRESULT hr = S_OK;
try
{
ErrMessage = L"";
bstr_t strSQLStmt = L"Select EmpNo,Name From Emp Where EmpNo='"
+ (bstr_t)EmpNo + L"'"; variant_t vntRecordsAffected;
_RecordsetPtr pObjADO_Recordset; pObjADO_Recordset = pObjADO_Connection->Execute (strSQLStmt,
&vntRecordsAffected,adCmdText);
pObjADO_Recordset->QueryInterface (IID_IDispatch,(void**)ppRecordset);
}
catch(_com_error &e)
{
ErrMessage = L"Query Failed";
}
return hr;
}int Cdb_emp::WriteLog(const char * Log)
{
int fh;
fh = _open( "D:\\temp\\Emp.Log", _O_APPEND,_S_IREAD | _S_IWRITE );
if ( fh == -1 ) 
{
_close(fh);
fh = _open("D:\\temp\\Emp.Log", _O_CREAT,_S_IREAD | _S_IWRITE );
}
    if( fh != -1 )
   {
       _write(fh, Log, sizeof( Log )) ;
      _close( fh );
   } return 0;
}STDMETHODIMP Cdb_emp::Sum()
{
// TODO: Add your implementation code here return S_OK;
}STDMETHODIMP Cdb_emp::get_ErrorMessage(BSTR *pVal)
{
// TODO: Add your implementation code here
    *pVal = ErrMessage;
return S_OK;
}

解决方案 »

  1.   

    我初接触VC,有些问题不太明白,请多包涵:
      你对查询返回的数据集是如何组织的?是返回RecordSet对象还是自已定义相应的结构,然后用OleVariant的形式返回?
      

  2.   

    http://www.csdn.net/expert/topic/567/567307.xml?temp=.9732172
      

  3.   

    用ado?用ole-db不是更直接吗?
      

  4.   

    查询返回的数据集,是一个Variant变量.
    在Vc中,可以直接用Adorecorset来接收,
    在Delphi中,需要定义一个olevariant变量来接收,但可以直接使用recordset对象的方法来操作.

      ovR1: OleVariant;
      ovR1 := Emp.GetRowsByNo(EmpNo.Text);
     ovR1.MoveFirst;