|
前段时间项目中用的是mysql数据库,它的连接方法有二种,一种是数据库自带的API,还有一种就用ADO连接了。
由于本次项目用的mysql数据库只是暂时的,后期可能会更改为MSSQL,所以如果用mysql自带的API连接移植性不好,所以改为ADO的,到时只要修改下字符串连接值就行了。
其实ADO连接的底层也是调用的ODBC驱动去连接,所以需要去下载个数据库对应的ODBC驱动,别人说秘本需要对应,要不然连接不上,我没有做太多测试,自己用的6.0版本,所以去官网下载了个mysql-connector-odbc-5.3.4-winx64版本的,然后对应的字符串为:
1
| driver={MySQL ODBC 5.3 ANSI Driver};Server=localhost;DATABASE=*;USER=*;PASSWORD=*;OPTION=3;
|
实测是可以连接成功的。
下面放出自己写的一个超级简单的类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| #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;
};
|
实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| 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电脑上可成功运行。所以也没管它了,有解决的小伙伴,可以提供下方法,谢谢!
|
|