vc连接mysql数据库的方法
前段时间项目中用的是mysql数据库,它的连接方法有二种,一种是数据库自带的API,还有一种就用ADO连接了。
由于本次项目用的mysql数据库只是暂时的,后期可能会更改为MSSQL,所以如果用mysql自带的API连接移植性不好,所以改为ADO的,到时只要修改下字符串连接值就行了。
其实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;
实测是可以连接成功的。
下面放出自己写的一个超级简单的类:
#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; };
实现:
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电脑上可成功运行。所以也没管它了,有解决的小伙伴,可以提供下方法,谢谢!
本文出自 “西边太阳” 博客,请务必保留此出处http://thgenius.blog.51cto.com/1042803/1611875
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。