ADO方式访问access数据库,实现函数
1.打开数据库
2.关闭数据库
3.查询
4.执行SQL语句
5.获取ADO记录集记录数量
连接数据库字符串查询 https://www.connectionstrings.com/sql-server-2008/
ADOConnectAccess.h
1 #pragma once
2
3 #pragma warning(disable:4146)
4 #import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
5 #pragma warning(default:4146)
6 using namespace ADODB;
7
8 //调用此类要先 AfxOleInit
9 class ADOConnectAccess
10 {
11 public:
12 ADOConnectAccess(CString);
13 ~ADOConnectAccess();
14
15 //初始化—连接数据库
16 BOOL ConnectDatabase();
17 //得到数据库记录集指针
18 _RecordsetPtr& GetRecordSet(_bstr_t);
19 //执行SQL语句
20 BOOL ExecuteSQL(_bstr_t);
21 //执行查询语句 为了查询个数 查询个数用查询语句查不能执行
22 _RecordsetPtr& GetRecordSetExecuteSQL(_bstr_t);
23 //断开连接
24 void DisconnectDatabase();
25
26 // 定义变量
27 public:
28 //添加一个指向Connection对象的指针:
29 _ConnectionPtr m_pConnection;
30 //添加一个指向Recordset对象的指针:
31 _RecordsetPtr m_pRecordset;
32
33 //mdb数据库文件全路径
34 CString strMDBPathName;
35 };
ADOConnectAccess.cpp
1 #include "stdafx.h"
2 #include "ADOConnectAccess.h"
3
4
5 ADOConnectAccess::ADOConnectAccess(CString strMdbPathName)
6 {
7 this->strMDBPathName = strMdbPathName;
8 }
9
10
11 ADOConnectAccess::~ADOConnectAccess()
12 {
13 }
14
15 //连接数据库
16 BOOL ADOConnectAccess::ConnectDatabase()
17 {
18 try
19 {
20 // 创建Connection对象
21 m_pConnection.CreateInstance("ADODB.Connection");
22 // 设置连接字符串,必须是BSTR型或者_bstr_t类型
23 CString sTemp;
24 sTemp.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"), strMDBPathName);
25 //sTemp = _T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Users\\wangen\\Desktop\\test.mdb");
26 _bstr_t strConnect = sTemp;
27 m_pConnection->Open(strConnect, "", "", adModeUnknown);
28 //m_pRecordset->Open(_variant_t(strConnect), NULL, adOpenStatic, adLockOptimistic, adCmdText);
29 return TRUE;
30 }
31 // 捕捉异常
32 catch (_com_error e)
33 {
34 // 显示错误信息
35 AfxMessageBox(e.Description());
36 return FALSE;
37 }
38 }
39
40 //得到数据库记录集指针
41 _RecordsetPtr& ADOConnectAccess::GetRecordSet(_bstr_t bstrSQL)
42 {
43 try
44 {
45 // 连接数据库,如果Connection对象为空,则重新连接数据库
46 if (m_pConnection == NULL)
47 {
48 BOOL res = ConnectDatabase();
49 if (res)
50 {
51 // 创建记录集对象
52 m_pRecordset.CreateInstance(__uuidof(Recordset));
53 // 取得表中的记录
54 m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(),
55 adOpenDynamic, adLockOptimistic, adCmdText);
56 }
57 else
58 {
59 m_pRecordset = NULL;
60 }
61 }
62 else
63 {
64 // 创建记录集对象
65 m_pRecordset.CreateInstance(__uuidof(Recordset));
66 // 取得表中的记录
67 m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(),
68 adOpenDynamic, adLockOptimistic, adCmdText);
69 }
70 }
71 // 捕捉异常
72 catch (_com_error e)
73 {
74 // 显示错误信息
75 AfxMessageBox(e.Description());
76 m_pRecordset = NULL;
77 }
78 // 返回记录集
79 return m_pRecordset;
80 }
81
82 //执行SQL语句
83 BOOL ADOConnectAccess::ExecuteSQL(_bstr_t bstrSQL)
84 {
85 try
86 {
87 // 连接数据库,如果Connection对象为空,则重新连接数据库
88 if (m_pConnection == NULL)
89 {
90 BOOL res = ConnectDatabase();
91 if (res)
92 {
93 m_pConnection->Execute(bstrSQL, NULL, adCmdText);
94 return TRUE;
95 }
96 else
97 {
98 return FALSE;
99 }
100 }
101 else
102 {
103 m_pConnection->Execute(bstrSQL, NULL, adCmdText);
104 return TRUE;
105 }
106 }
107 // 捕捉异常
108 catch (_com_error e)
109 {
110 // 显示错误信息
111 AfxMessageBox(e.Description());
112 return FALSE;
113 }
114 }
115
116
117 _RecordsetPtr& ADOConnectAccess::GetRecordSetExecuteSQL(_bstr_t bstrSQL)
118 {
119 try
120 {
121 // 连接数据库,如果Connection对象为空,则重新连接数据库
122 if (m_pConnection == NULL)
123 {
124 BOOL res = ConnectDatabase();
125 if (res)
126 {
127 m_pRecordset = m_pConnection->Execute(bstrSQL, NULL, adCmdText);
128 }
129 else
130 {
131 m_pRecordset = NULL;
132 }
133 }
134 else
135 {
136 m_pRecordset = m_pConnection->Execute(bstrSQL, NULL, adCmdText);
137 }
138 return m_pRecordset;
139 }
140 // 捕捉异常
141 catch (_com_error e)
142 {
143 // 显示错误信息
144 AfxMessageBox(e.Description());
145 return m_pRecordset;
146 }
147 }
148
149
150 //断开连接数据库
151 void ADOConnectAccess::DisconnectDatabase()
152 {
153 // 关闭记录集和连接
154 if (m_pRecordset != NULL)
155 {
156 m_pRecordset->Close();
157 m_pRecordset = NULL;
158 }
159 if (m_pConnection != NULL)
160 {
161 m_pConnection->Close();
162 m_pConnection = NULL;
163 }
164 }
调用代码
1 void xxxDlg::OnBnClickedOk()
2 {
3 // TODO: 在此添加控件通知处理程序代码
4 //////////////////////////////////////////////////////////////////////////
5 //连接
6 CString strPath = GetExeRootPath();
7 CString strName = _T("test.mdb");
8 CString strPathName = strPath + strName;
9
10 ADOConnectAccess m_access(strPathName);
11 //BOOL res = m_access.ConnectDatabase();
12 //if (res)
13 //{
14 // MessageBox(_T("数据库连接成功"));
15 //}
16 //else
17 //{
18 // MessageBox(_T("数据库连接失败"));
19 //}
20 ////////////////////////////////////////////////////////////////////////
21 //查询
22 //CString strSql = _T("select (count)* from qwerasdf;");//table是关键词
23 //_bstr_t bstrSql = strSql;
24 //m_access.GetRecordSet(bstrSql);
25 //FieldsPtr pFields = m_access.m_pRecordset->GetFields();
26 //int nCount = pFields->GetCount();
27 //FieldPtr pField;
28 //CString strTitle, strValue;
29 //_variant_t varValue;
30 //字段名
31 //for (int i = 0; i < nCount; i++)
32 //{
33 // pField = pFields->GetItem((_variant_t)(long)i);
34 // strTitle = (LPCSTR)pField->Name;
35 // MessageBox(strTitle);
36 //}
37 //已知字段名
38 //if (!m_access.m_pRecordset->adoEOF)
39 //{
40 // int iValue;
41 // while (!m_access.m_pRecordset->adoEOF)
42 // {
43 // //索引方式查询或字段名方式查询
44 // //varValue = m_access.m_pRecordset->GetCollect(_variant_t((long)0));//这两种方式都可用
45 // varValue = m_access.m_pRecordset->GetCollect("ID");
46 // iValue = varValue.intVal;
47 // strValue.Format(_T("%d"), iValue);
48 // MessageBox(strValue);
49 // //varValue = m_access.m_pRecordset->GetCollect(_variant_t((long)1));
50 // varValue = m_access.m_pRecordset->GetCollect("value1");
51 // strValue = varValue.bstrVal;
52 // MessageBox(strValue);
53 // //varValue = m_access.m_pRecordset->GetCollect(_variant_t((long)2));
54 // varValue = m_access.m_pRecordset->GetCollect("value2");
55 // strValue = varValue.bstrVal;
56 // MessageBox(strValue);
57 // m_access.m_pRecordset->MoveNext();
58 // }
59 //}
60
61 //int res = m_access.m_pRecordset->GetRecordCount();//-1
62 //CString strMsg;
63 //strMsg.Format(_T("%d"), res);
64 //MessageBox(strMsg);
65
66 //m_access.DisconnectDatabase();
67 //////////////////////////////////////////////////////////////////////////
68 //执行SQL
69 //CString strSql = _T("INSERT INTO qwerasdf (`value1`, `value2`) VALUES ('222', '222')");
70 //bstr_t bStrSql = strSql;
71 //BOOL res = m_access.ExecuteSQL(bStrSql);
72 //if (res)
73 //{
74 // MessageBox(_T("执行成功"));
75 //}
76 //else
77 //{
78 // MessageBox(_T("执行失败"));
79 //}
80 //m_access.DisconnectDatabase();
81 //////////////////////////////////////////////////////////////////////////
82 //执行查询语句 查询个数
83 CString strSql = _T("SELECT COUNT(0) FROM qwerasdf");
84 bstr_t bStrSql = strSql;
85 m_access.m_pRecordset = m_access.GetRecordSetExecuteSQL(bStrSql);
86 _variant_t varValue;
87 int iValue;
88 CString strValue;
89 while (!m_access.m_pRecordset->adoEOF)
90 {
91 varValue = m_access.m_pRecordset->GetCollect(_variant_t((long)0));//这两种方式都可用
92 iValue = varValue.intVal;
93 strValue.Format(_T("%d"), iValue);
94 MessageBox(strValue);
95 m_access.m_pRecordset->MoveNext();
96 }
97 m_access.DisconnectDatabase();
98 }
注意事项
ADO记录集获取记录数量
这里的方法我用的是第3种,前2种没编译过
2.
_variant_t((long)0) 这里的long一定不能少,少了编译没问题,运行就全是异常了
3.
strTitle = (LPCSTR)pField->Name; _bstr_t 转CString, 用format %s 是乱码的
4.字段名的引号是复制的,我也不知道键盘怎么输入 `
在Access中执行SQL语句
5..mdb格式数据库文件和.accdb格式数据库文件,只在连接字符串有区别
sTemp.Format(_T("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s"), strMDBPathName);//.mdb
sTemp.Format(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Persist Security Info=False;"), strMDBPathName);//.accdb
6.远程连接access数据库
可以先共享文件夹,然后直接访问他的网络地址
sTemp.Format(_T("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=\\xx.xx.xx.xx\xxx\xxx.accdb;Persist Security Info=False;"), strMDBPathName);
登录的时候可能需要先用文件夹访问共享文件夹,输入登录名和密码(不知道这个记住凭证是否只需要登录一次),否则报错
7.判断查询的结果是不是空的
if ((varValue.vt != VT_NULL) || (varValue.vt != VT_EMPTY))