MFC VC++ ADO方式连接SQL server 2008 R2数据库

ADO (ActiveX Data Objects,ActiveX数据对象)是Microsoft提出的应用程序接口 API 用以实现访问关系或非关系数据库中的数据。

ADO 是一项微软的技术

ADO 指 ActiveX 数据对象(ActiveX Data Objects)

ADO 是一个微软的 Active-X 组件

ADO 会随微软的 IIS 被自动安装

ADO 是一个访问数据库中数据的编程接口

 

把ado的这个数据库操作封装成一个MFC DLL,目的是支持MFC中的类跟MFC配合起来方便

参考 

MFC DLL的创建和调用

 1 // ADODLL.h : ADODLL DLL 的主头文件
 2 //
 3 
 4 #pragma once
 5 
 6 #ifndef __AFXWIN_H__
 7 #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"
 8 #endif
 9 
10 #include "resource.h"        // 主符号
11 
12 
13 // CADODLLApp
14 // 有关此类实现的信息,请参阅 ADODLL.cpp
15 //
16 
17 class CADODLLApp : public CWinApp
18 {
19 public:
20     CADODLLApp();
21 
22     // 重写
23 public:
24     virtual BOOL InitInstance();
25 
26     DECLARE_MESSAGE_MAP()
27 };
28 
29 
30 //#import "C://Program Files//Common Files//System//ado//msado15.dll" no_namespace rename("EOF","adoEOF")rename("BOF","adoBOF")
31 
32 //这样写是因为上面那句有编译错误
33 #pragma warning(disable:4146)
34 #import "C:/Program Files/Common Files/System/ADO/msado15.dll" named_guids rename("EOF","adoEOF"), rename("BOF","adoBOF")
35 #pragma warning(default:4146)
36 using namespace ADODB;
37 
38 
39 
40 class __declspec(dllexport) ADOCOM;
41 
42 class ADOCOM  
43 {    
44     //定义方法    
45 public:
46     ADOCOM();
47     virtual ~ADOCOM();
48     void setConnectData(CString, CString, CString, CString);
49     // 初始化—连接数据库
50     BOOL OnInitADOCOM();
51     // 执行查询
52     _RecordsetPtr& GetRecordSet(_bstr_t bstrSQL);
53     // 执行SQL语句,Insert Update _variant_t
54     BOOL ExecuteSQL(_bstr_t bstrSQL);
55     //获取某个表的所有字段名
56     //strTableName  --- 表名
57     //columnNamesArray -- 存放字段名的字符串(CString类型)数组
58     void GetAllColumnNames(CString strTableName);
59     //判断某个表是否存在该字段。
60     //Parameters:
61     //strTablename -- 表名
62     //strcolumnName -- 字段名
63     BOOL IsExistColumn(CString strTableName,CString strcolumnName);
64     //判断数据库中是否存在某个标
65     //Parameters:
66     //strTableName---表名
67     BOOL IsExistTable(CString strTableName);
68 
69     //获取数据库中的所有表名
70     //TableNamesArray -- 存放表名的字符串(CString类型)数组
71     void GetAllTableNames();
72 
73     //断开连接
74     void ExitConnect();
75 
76     // 定义变量
77 public:
78     //添加一个指向Connection对象的指针:
79     _ConnectionPtr m_pConnection;
80     //添加一个指向Recordset对象的指针:
81     _RecordsetPtr m_pRecordset;
82     CString m_strServer;
83     CString m_strDatabase;
84     CString m_strUserID;
85     CString m_strPassword;
86 
87     CStringArray colNamesArray;
88     CStringArray TableNamesArray;
89 };
  1 // ADODLL.cpp : 定义 DLL 的初始化例程。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include "ADODLL.h"
  6 
  7 #ifdef _DEBUG
  8 #define new DEBUG_NEW
  9 #endif
 10 
 11 //
 12 //TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,
 13 //        则从此 DLL 导出的任何调入
 14 //        MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到
 15 //        该函数的最前面。
 16 //
 17 //        例如:
 18 //
 19 //        extern "C" BOOL PASCAL EXPORT ExportedFunction()
 20 //        {
 21 //            AFX_MANAGE_STATE(AfxGetStaticModuleState());
 22 //            // 此处为普通函数体
 23 //        }
 24 //
 25 //        此宏先于任何 MFC 调用
 26 //        出现在每个函数中十分重要。这意味着
 27 //        它必须作为函数中的第一个语句
 28 //        出现,甚至先于所有对象变量声明,
 29 //        这是因为它们的构造函数可能生成 MFC
 30 //        DLL 调用。
 31 //
 32 //        有关其他详细信息,
 33 //        请参阅 MFC 技术说明 33 和 58。
 34 //
 35 
 36 // CADODLLApp
 37 
 38 BEGIN_MESSAGE_MAP(CADODLLApp, CWinApp)
 39 END_MESSAGE_MAP()
 40 
 41 
 42 // CADODLLApp 构造
 43 
 44 CADODLLApp::CADODLLApp()
 45 {
 46     // TODO: 在此处添加构造代码,
 47     // 将所有重要的初始化放置在 InitInstance 中
 48 }
 49 
 50 
 51 // 唯一的一个 CADODLLApp 对象
 52 
 53 CADODLLApp theApp;
 54 
 55 
 56 // CADODLLApp 初始化
 57 
 58 BOOL CADODLLApp::InitInstance()
 59 {
 60     CWinApp::InitInstance();
 61 
 62     return TRUE;
 63 }
 64 
 65 
 66 
 67 
 68 ADOCOM::ADOCOM()
 69 {
 70     m_strServer = _T("192.168.58.129");
 71     m_strDatabase = _T("testserver");
 72     m_strUserID = _T("sa");
 73     m_strPassword = _T("123456");
 74     // 初始化OLE/COM库环境 
 75     ::CoInitialize(NULL);
 76 }
 77 
 78 ADOCOM::~ADOCOM()
 79 {
 80     // 释放环境
 81     ::CoUninitialize();
 82 }
 83 
 84 
 85 void ADOCOM::setConnectData(CString server, CString database, CString userid, CString password)
 86 {
 87     m_strServer = server;
 88     m_strDatabase = database;
 89     m_strUserID = userid;
 90     m_strPassword = password;
 91 }
 92 
 93 
 94 // 初始化—连接数据库
 95 BOOL ADOCOM::OnInitADOCOM()
 96 {
 97     try
 98     {
 99         // 创建Connection对象
100         m_pConnection.CreateInstance("ADODB.Connection");
101         //加这个东西好像没啥用
102         //m_pConnection->ConnectionTimeout = 5;//设置连接超时时间
103         //m_pConnection->CommandTimeout = 50;//设置执行命令超时时间
104         //设置连接字符串
105         CString sTemp;
106         sTemp.Format(_T("Provider=SQLOLEDB.1; Server=%s; Database=%s; uid=%s;pwd=%s;"), m_strServer, m_strDatabase, m_strUserID, m_strPassword);
107         _bstr_t strConnect = sTemp;
108         m_pConnection->Open(strConnect, "", "", adModeUnknown);
109         return TRUE;
110     }
111     // 捕捉异常
112     catch(_com_error e)
113     {
114         // 显示错误信息s
115         AfxMessageBox(e.ErrorMessage());
116         return FALSE;
117     }
118 }
119 
120 // 执行查询
121 _RecordsetPtr&  ADOCOM::GetRecordSet(_bstr_t bstrSQL)
122 {
123     try
124     {
125         // 连接数据库,如果Connection对象为空则结束查询
126         if(m_pConnection == NULL)
127         {
128             m_pRecordset = NULL;
129             return m_pRecordset;
130         }
131         // 创建记录集对象
132         m_pRecordset.CreateInstance(__uuidof(Recordset));
133         // 取得表中的记录
134         m_pRecordset->Open(bstrSQL, m_pConnection.GetInterfacePtr(), adOpenDynamic, adLockOptimistic, adCmdText);
135     }
136     // 捕捉异常
137     catch(_com_error e)
138     {
139         // 显示错误信息
140         AfxMessageBox(e.ErrorMessage());
141         m_pRecordset = NULL;
142         return m_pRecordset;
143     }
144     // 返回记录集
145     return m_pRecordset;
146 }
147 
148 // 执行SQL语句,Insert Update _variant_t
149 BOOL ADOCOM::ExecuteSQL(_bstr_t bstrSQL)
150 {
151     try
152     {
153         // 是否已经连接数据库
154         if(m_pConnection == NULL)
155         {
156             return FALSE;
157         }
158         // Connection对象的Execute方法:(_bstr_t CommandText, 
159         // VARIANT * RecordsAffected, long Options ) 
160         // 其中CommandText是命令字串,通常是SQL命令。
161         // 参数RecordsAffected是操作完成后所影响的行数, 
162         // 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
163         // adCmdProc-存储过程;adCmdUnknown-未知
164         m_pConnection->Execute(bstrSQL, NULL, adCmdText);
165         return TRUE;
166     }
167     catch(_com_error e)
168     {
169         AfxMessageBox(e.ErrorMessage());
170         return FALSE;
171     }
172 }
173 
174 //获取某个表的所有字段名
175 void ADOCOM::GetAllColumnNames(CString strTableName)
176 {
177     //CStringArray columnNamesArray;
178     FieldPtr pField;
179     CString strColName = _T("");
180     CString strSql = _T("");
181     _bstr_t vSQL = _T("");
182     strSql.Format(_T("SELECT * FROM %s"), strTableName);
183     vSQL = strSql;
184     _RecordsetPtr pRecordset = GetRecordSet(vSQL);
185     if (pRecordset == NULL)
186     {
187         colNamesArray.RemoveAll();
188         return;
189     }
190     FieldsPtr pFields = pRecordset->GetFields();
191     colNamesArray.RemoveAll();
192     for (int i = 0;i < pFields->Count; i++)
193     {
194         pField = pFields->GetItem(long(i));
195         strColName = (LPCTSTR)(_bstr_t)pField->Name;
196         colNamesArray.Add(strColName);
197     }
198 }
199 
200 //判断某个表是否存在该字段。
201 //Parameters:
202 //strTablename -- 表名
203 //strcolumnName -- 字段名
204 BOOL ADOCOM::IsExistColumn(CString strTableName, CString strcolumnName)
205 {
206     BOOL bReturn = FALSE;
207     GetAllColumnNames(strTableName);
208 
209     for (int i = 0; i < colNamesArray.GetSize(); i++)
210     {
211         if (strcolumnName == colNamesArray.GetAt(i))
212         {
213             bReturn = TRUE;
214             break;
215         }
216     }
217     return bReturn;
218 }
219 
220 //判断数据库中是否存在某个表
221 //Parameters:
222 //strTableName---表名
223 BOOL ADOCOM::IsExistTable(CString strTableName)
224 {
225     CString strSql;
226     _bstr_t vSQL;
227     strSql.Format(_T("select * from sysobjects where name='%s'"),strTableName);
228     vSQL = strSql;
229 
230     _RecordsetPtr pRecordset = GetRecordSet(vSQL);
231     if (!pRecordset->adoEOF)
232     {
233         return TRUE;
234     }
235     else
236     {
237         return FALSE;
238     }    
239 }
240 
241 //获取数据库中的所有表名
242 //TableNamesArray -- 存放表名的字符串(CString类型)数组
243 void ADOCOM::GetAllTableNames()
244 {
245     CString strTableName;
246     CString strSql;
247     _bstr_t vSQL;
248     strSql = "select * from sysobjects";
249     vSQL = strSql;
250     _RecordsetPtr pRecordset = GetRecordSet(vSQL);
251     TableNamesArray.RemoveAll();
252     while(!pRecordset->adoEOF)
253     {
254         strTableName = (LPCTSTR)(_bstr_t)pRecordset->GetCollect("name");
255         TableNamesArray.Add(strTableName);
256         pRecordset->MoveNext();
257     }
258 }
259 
260 
261 void ADOCOM::ExitConnect()
262 {
263     // 关闭记录集和连接
264     if (m_pRecordset != NULL)
265     {
266         m_pRecordset->Close();
267         //m_pRecordset->Release(); //这里空和release都影响下次连接后查询
268         //m_pRecordset = NULL;
269     }
270     if (m_pConnection->GetState() == adStateOpen)//这里释放要和连接对应
271     {
272         m_pConnection->Close();
273     }
274     if (m_pConnection)
275     {
276         m_pConnection.Release();
277         m_pConnection = NULL;
278     }
279 }

把.h文件和.lib加入到调用的工程 声明这个类的对象

 1     m_ado.setConnectData(m_strSqlServer, m_strSqlDatabase, m_strSqlUserName, m_strSqlPassword);
 2     BOOL bRet;
 3     bRet = m_ado.OnInitADOCOM();
 4     if (bRet)
 5     {
 6         //向表中插入一条数据
 7         CString strTemp;
 8         strTemp.Format(_T("insert into table(item1, item2, item3) values ('%s', '%d', '%d')"), 
 9             str, 0, 1);
10         _bstr_t str_insert = strTemp;
11         bRet = m_ado.ExecuteSQL(str_insert);
12         m_ado.ExitConnect();
13     }
14     return bRet;
 1     m_ado.setConnectData(m_strSqlServer, m_strSqlDatabase, m_strSqlUserName, m_strSqlPassword);
 2     BOOL bRet;
 3     bRet = m_ado.OnInitADOCOM();
 4     if (bRet)
 5     {
 6         //查询数据库中是否有表table
 7         bRet = m_ado.IsExistTable(_T("table"));
 8         if (!bRet)
 9         {
10             //如果不存在就创建表table
11             _bstr_t str_CreateTable = 
12             "CREATE TABLE table(item1 char(50) primary key, item2 int, item3 int, item4 int)";
13             bRet = m_ado.ExecuteSQL(str_CreateTable);
14         }
15         m_ado.ExitConnect();
16     }
17     return bRet;

 

posted @ 2020-11-18 21:28  ckrgd  阅读(556)  评论(0)    收藏  举报