前段時間項目中用的是mysql數據庫,它的鏈接方法有二種,一種是數據庫自帶的API,還有一種就用ADO鏈接了。mysql
因爲本次項目用的mysql數據庫只是暫時的,後期可能會更改成MSSQL,因此若是用mysql自帶的API鏈接移植性很差,因此改成ADO的,到時只要修改下字符串鏈接值就好了。sql
其實ADO鏈接的底層也是調用的ODBC驅動去鏈接,因此須要去下載個數據庫對應的ODBC驅動,別人說祕本須要對應,要否則鏈接不上,我沒有作太多測試,本身用的6.0版本,因此去官網下載了個mysql-connector-odbc-5.3.4-winx64版本的,而後對應的字符串爲:數據庫
driver={MySQL ODBC 5.3 ANSI Driver};Server=localhost;DATABASE=*;USER=*;PASSWORD=*;OPTION=3;
實測是能夠鏈接成功的。ide
下面放出本身寫的一個超級簡單的類:測試
#pragma once #import <C:\Program Files\Common Files\System\ADO\msado15.dll> no_namespace rename("EOF", "adoEOF") // #import "msado15.DLL" rename_namespace("ADOWE") rename("EOF","adoEOF") // using namespace ADOWE; class CAdoDatabase { public: CAdoDatabase(void); public: ~CAdoDatabase(void); public: //BOOL Connect(CString csConnectStr,CString csUser,CString csPasswd); //鏈接 BOOL Connect(CString csConnectStr); //斷開鏈接 BOOL DisConn(); //執行語句 BOOL Execute(CString csSQL); //是否鏈接 BOOL IsConn(); //返回結果的行數 int QueryDataForRecord(CString csSql,CStringArray& csa); private: _ConnectionPtr m_pConn; _RecordsetPtr m_pRecord; };
實現:ui
BOOL CAdoDatabase::Connect(CString csConnectStr) { HRESULT hr; try { hr = m_pConn.CreateInstance(__uuidof(Connection)); //hr = m_pConn.CreateInstance("ADODB.Connection"); //m_pConn->Open(_bstr_t(csConnectStr),"","",ADODB::adConnectUnspecified); m_pConn->Open(_bstr_t(csConnectStr),"","",adModeUnknown); return TRUE; } catch (_com_error e) { CString csErrorMsg; csErrorMsg.Format(_T("鏈接數據庫出錯:%s"),e.ErrorMessage()); AfxMessageBox(csErrorMsg,MB_OK+MB_ICONERROR); return FALSE; } } BOOL CAdoDatabase::DisConn() { if (m_pConn->State) { m_pConn->Close(); m_pConn = NULL; return TRUE; } return FALSE; } BOOL CAdoDatabase::Execute(CString csSQL) { try { _variant_t RecordsAffected; m_pConn->Execute((_bstr_t)csSQL,&RecordsAffected,adCmdText); return TRUE; }catch(_com_error e) { CString csMsg; csMsg.Format(_T("執行SQL語句出錯:%s"),e.ErrorMessage()); AfxMessageBox(csMsg,MB_OK+MB_ICONERROR); return FALSE; } } int CAdoDatabase::QueryDataForRecord(CString csSql, CStringArray &csa) { try { m_pRecord.CreateInstance(__uuidof(Recordset)); //m_pRecord->Open((_bstr_t)csSql,m_pConn.GetInterfacePtr(),adOpenStatic,adLockOptimistic,adCmdText); m_pRecord->Open((_bstr_t)csSql,_variant_t((IDispatch *)m_pConn, true),adOpenKeyset,adLockReadOnly,adCmdText); int nCount; int nRowCount = 0; nCount = m_pRecord->Fields->GetCount(); _variant_t vt; while (!m_pRecord->adoEOF) { for (int i=0; i<nCount; i++) { vt =m_pRecord->Fields->GetItem(long(i))->GetValue(); if (vt.vt == VT_NULL) { vt = _T(""); } csa.Add(vt); } nRowCount++; m_pRecord->MoveNext(); } m_pRecord->Close(); return nRowCount; }catch(_com_error e) { CString csMsg; csMsg.Format(_T("查詢語句出錯:%s"),e.ErrorMessage()); AfxMessageBox(csMsg,MB_OK+MB_ICONERROR); return -1; } }
此代碼運行平臺爲WIN7,我把它放到XP上運行時,提示無效指針,網上查了下是平臺兼容性的問題,換到其它WIN7電腦上可成功運行。因此也沒管它了,有解決的小夥伴,能夠提供下方法,謝謝!
spa