//#import "c:\program files\common files\system\ado\msado15.dll " rename ( "EOF ", "adoEOF ") no_namespace
#define CREATEiNSTANCE(sp,riid) { HRESULT _hr =sp .CreateInstance( __uuidof( riid ) ) \
if (FAILED(_hr)) _com_issue_error(_hr) }
#define RsITEM(rs,x) ((rs->Fields->Item[_variant_t(x)]->Value))
class CHmbAdoDB
{
public:
BOOL m_bOpen
_ConnectionPtr m_DbConn
CString m_ErrMsg
CString m_SQLState
long mSqlCode
public:
void Cancel()
BOOL IsOpen()
void RollbackTrans()
void CommitTrans()
long BeginTrans()
void Close()
BOOL Open(LPCSTR lpszConnect)
BOOL Execute(LPCTSTR lpSQL)
void ProviderError()
CHmbAdoDB()
{
}
virtual ~CHmbAdoDB()
{
}
}
class CHmbAdoDBRs : public CObject
{
public:
_RecordsetPtr m_Rs
public:
CHmbAdoDBRs()
virtual ~CHmbAdoDBRs()
BOOL Open( CHmbAdoDB *pDB, LPCSTR szSource,long option=-1)
void Close()
void GetRs(_variant_t x,_bstr_t &ret)
void GetRs(_variant_t x,CString &ret)
BOOL IsEOF()
BOOL IsOpen()
BOOL MoveNext()
BOOL MovePrev()
BOOL MoveFirst()
BOOL MoveLast()
}
#endif // !defined(AFX_RfidAdoDB_H__7C539954_1C62_47B6_AB6E_1A5BB73A67E5__INCLUDED_) truct InitOle
{
InitOle() { ::CoInitialize(NULL) }
~InitOle() { ::CoUninitialize() }
} _init_InitOle_
long mSqlCode
BOOL CHmbAdoDB::Open(LPCSTR lpszConnect)
{
try
{
CREATEiNSTANCE(m_DbConn,Connection)
m_DbConn->Open(lpszConnect, " ", " ", adModeUnknown )
}
catch( _com_error &e)
{
return FALSE
}
catch(...)
{
return FALSE
}
return TRUE
}
void CHmbAdoDB::Close()
{
if( IsOpen() )
{
m_DbConn->Close()
}
}
long CHmbAdoDB::BeginTrans()
{
return m_DbConn->BeginTrans()
}
void CHmbAdoDB::CommitTrans()
{
m_DbConn->CommitTrans()
}
void CHmbAdoDB::RollbackTrans()
{
m_DbConn->RollbackTrans()
}
void CHmbAdoDB::Cancel()
{
m_DbConn->Cancel()
}
BOOL CHmbAdoDB::IsOpen()
{
return ( (m_DbConn->GetState() != 0) ? TRUE : FALSE )
}
BOOL CHmbAdoDB::Execute(LPCTSTR lpSQL)
{
if (!IsOpen())
{
AfxMessageBox( "Network error, Database do not open. ")
return FALSE
}
CString strSQL(lpSQL)
strSQL.TrimLeft()
strSQL.TrimRight()
try
{
m_DbConn->Execute(_bstr_t(strSQL), NULL, adExecuteNoRecords)
}
catch( _com_error &e)
{
return FALSE
}
catch(...)
{
return FALSE
}
return TRUE
}
void CHmbAdoDB::ProviderError()
{
// Print Provider Errors from Connection object.
// pErr is a record object in the Connection 's Error collection.
ErrorPtr pErr = NULL
if( (m_DbConn->Errors->Count) > 0)
{
long nCount = m_DbConn->Errors->Count
// Collection ranges from 0 to nCount -1.
for(long i = 0 i < nCount i++)
{
pErr = m_DbConn->Errors->GetItem(i)
mSqlCode = pErr->NativeError
m_ErrMsg.Format( "SQLCODE : %ld\t%s ",mSqlCode, LPCTSTR(pErr->Description))
m_SQLState.Format( "%s ",(char*)pErr->SQLState)
printf( "%s // %s\n ",m_SQLState,m_ErrMsg)
}
}
m_DbConn->Errors->Clear()
}
CHmbAdoDBRs::CHmbAdoDBRs( )
{
}
CHmbAdoDBRs::~CHmbAdoDBRs()
{
}
BOOL CHmbAdoDBRs::Open( CHmbAdoDB *pDB, LPCSTR szSource,long option )
{
CString strSQL
strSQL = CString(szSource)
strSQL.TrimLeft()
strSQL.TrimRight()
_variant_t vRecsAffected(0L)
// CREATEiNSTANCE( m_Rs,Recordset)
// m_Rs->PutRefActiveConnection( pDB->m_DbConn )
try
{
m_Rs = pDB->m_DbConn->Execute(_bstr_t(strSQL),
&vRecsAffected,
adOptionUnspecified)
m_Rs->AddRef()
// m_Rs->Open(szSource, vtMissing, adOpenKeyset, adLockBatchOptimistic, adOptionUnspecified)
// m_Rs->Open(szSource, vtMissing, adOpenKeyset, adLockReadOnly, option)
// m_Rs->Open(szSource,pDB->m_DbConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic, adCmdText)
}
catch( _com_error &e)
{
//ErrorMessage()
m_Rs->Close()
m_Rs->Release()
return FALSE
}
catch(...)
{
m_Rs->Close()
m_Rs->Release()
return FALSE
}
return TRUE
}
void CHmbAdoDBRs::Close()
{
m_Rs->Close()
m_Rs->Release()
}
void CHmbAdoDBRs::GetRs(_variant_t x,_bstr_t &ret)
{
ret = (m_Rs->Fields->Item[x]->Value)
}
void CHmbAdoDBRs::GetRs(_variant_t x,CString &ret)
{
_bstr_t retVal
try{
retVal = (m_Rs->Fields->Item[x]->Value)
}
catch(...){
ret = " "
return
}
ret = CString((char*) retVal)
}
BOOL CHmbAdoDBRs::IsEOF()
{
return m_Rs->adoEOF
}
BOOL CHmbAdoDBRs::IsOpen()
{
return ( (m_Rs->GetState() != 0) ? TRUE : FALSE )
}
BOOL CHmbAdoDBRs::MoveNext() { return (FAILED(m_Rs->MoveNext()) ? FALSE : TRUE ) }
BOOL CHmbAdoDBRs::MovePrev() { return (FAILED(m_Rs->MovePrevious()) ? FALSE : TRUE ) }
BOOL CHmbAdoDBRs::MoveFirst() { return (FAILED(m_Rs->MoveFirst()) ? FALSE : TRUE ) }
BOOL CHmbAdoDBRs::MoveLast() { return (FAILED(m_Rs->MoveLast()) ? FALSE : TRUE ) }
以上为一个ADO的封装类.
现在一般是用ADO的方法.
1、C/C++与数据库交互,像 mssql/ mysql / oracle 等,一般都有成熟的第三方库,这些库里面无非就是封装了与数据库通讯的方式和通讯协议搜一下要用的数据库相关的 API 文档,会说得很清楚任何文件都是二进制数据,关键是数据存储的组织方式通用扩展名的文件,像gif/doc/jpg/wav,格式都是固定的。
2、举个例子,连接SQL:
// 打开数据库strDBClass.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0Data Source=%sJet OLEDB:Database Password=%s"), m_strUnEntryptMdbFilePath,m_strMDBPassword)
// 创建连接
HRESULT hr = m_pConnection.CreateInstance(_uuidof(Connection))
_ConnectionPtr m_pConnection->Open(m_strDBClass,_T(""),_T(""),adConnectUnspecified)
// 声明表单指针
_RecordsetPtr pBandRecordset
pBandRecordset.CreateInstance(__uuidof(Recordset))
// 执行语句
CString strSQL(L"SELECT * FROM [Band]")
m_pConnection->Execute((LPCTSTR)strSQL,NULL,0)
// 提取某一项 例如BandInfo
int iBandInfo = wcscmp(colum, L"BandInfo")
while(!recordsetPtr->adoEOF)
{
var = recordsetPtr->GetCollect(colum)
if(var.vt != VT_NULL)
strName = (LPCSTR)_bstr_t(var)
recordsetPtr->MoveNext()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)