给你一段不完整的代码.
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;
}
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;
}
你对查询返回的数据集是如何组织的?是返回RecordSet对象还是自已定义相应的结构,然后用OleVariant的形式返回?
在Vc中,可以直接用Adorecorset来接收,
在Delphi中,需要定义一个olevariant变量来接收,但可以直接使用recordset对象的方法来操作.
如
ovR1: OleVariant;
ovR1 := Emp.GetRowsByNo(EmpNo.Text);
ovR1.MoveFirst;