第一篇:VC++中MFC用Ado连接数据库小结
VC++中MFC用Ado连接数据库小结
VC++中使用MFC通过ADO连接数据库方法小结(不包括异常的捕捉)这里主要讲MFC与SQL2000数据库的连接。1.在StdAfx.h头文件中加入此句子
#import “c:program filescommon filessystemadomsado15.dll” no_namespace rename(“EOF”,“adoEOF”)2.在App类的InitInstance()函数中加入 ::CoInitialize(NULL);//表示com库的初始化
鼠标右键点击App类名添加虚函数ExitInstance(),在其中加入代码 ::CoUninitialize();//释放com库。3.获取连接字符串。
最简单的方法就是新建一个.txt文件,将其后缀名改为.udl,双击它,在“提供程序”标签页中选择“Microsoft OLE DB Provide fo Sql Server”,然后在“连接”标签页选择填写服务器、数据库、登陆方式等信息,最后按“确定”。连接完成之后,将其用写字板打开,第三行信息,如“Provider=SQLOLEDB.1;Integrated
Security=SSPI;Persist
Security Info=False;Initial Catalog=RuleDB_Data;Data Source=PYE”即为连接字符串。注意,若数据库位于本机,在选择填写服务器一栏可直接填写(local),记得一定要加括号。4.连接数据库
在这里引入一个编写好的封装类:ADOConn。该类封装了连接数据库,对数据库进行添加、删除、修改操作及获取查询记录集操作的方法。用户可直接使用,这个类的头文件和cpp文件内容将在本文最后给出。
在一个工程里加入该类的方法为:把该类的头文件和cpp文件拷贝到工程所在的文件夹里。然后在工程的工作区选择Project->Add to Project->Files,将这两个文件选择加入。之后,就可以在程序里应用这个类了。
首先在要用到数据库的类的头文件里设一个该类的对象,即加入代码:ADOConn m_Ado;注意:记得要先在最前面加入#include “ADOConn.h”。
在应用这个对象对数据库进行操作之前,先对其初始化: m_Ado.OnInitADOConn(strConnect);其中strConnect即为上面获取的连接字符串。
若要获取数据库中的部分记录集,用m_Ado.GetRecordSet(strSql);其中strSql中存放查询语句,查询结果存放于m_Ado.m_pRecordset中,然后可用GetCollect()函数挨个获取所有符合条件的记录的各个字段的值。用完后记得用m_Ado.m_pRecordset.Close()关闭记录集。
添加、修改、删除操作,均用 m_Ado.ExecuteSQL(strSql);语句完成。
此外,若同时需要多种记录集,则还需在要用到数据库的类的头文件里添加记录集的对象,即_RecordsetPtr m_pRecordset;m_pRecordset在用之前也需初始化,初始化语句为: m_pRecordset.CreateInstance(__uuidof(Recordset));,同样的,每回记录集用完之后也得用Close()函数关闭。5.若在数据库应用程序编译时遇到102个错误,则可把Debug文件夹删了重新编译即可。ADOConn类的头文件:
#if!defined(AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_)#define AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 class ADOConn : public CObject { public: //添加一个指向Connection对象的指针: _ConnectionPtr m_pConnection;//添加一个指向Recordset对象的指针: _RecordsetPtr m_pRecordset;char error[1024];public: _ConnectionPtr& GetConnPtr(){return m_pConnection;} _RecordsetPtr& GetRecoPtr(){return m_pRecordset;} public: //事务回滚
BOOL RollbackTrans();//递交 事务 BOOL CommitTrans();//事务开始 BOOL BeginTrans();BOOL adoBOF();//头 BOOL adoEOF();//尾 BOOL MoveNext();//下一个 BOOL CloseTable();//关闭表
BOOL CloseADOConnection();//关闭连接
BOOL GetCollect(LPCTSTR Name,CString &lpDest);//获取某个字段的值 //执行SQL语句 包含update delete insert BOOL ExecuteSQL(LPCTSTR lpszSQL);//初始化连接数据库
BOOL OnInitADOConn(LPCTSTR ConnStr);// 执行select语句 获取记录集
_RecordsetPtr& GetRecordSet(LPCTSTR lpszSQL);ADOConn();virtual ~ADOConn();};#endif //!defined(AFX_ADOCONN_H__2B491720_FA04_4800_B616_219E55ABEA46__INCLUDED_)class CADOException : public CException { public: // Constructor CADOException(char* pchMessage);public: ~CADOException(){} CString m_strMessage;virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError, PUINT pnHelpContext = NULL);private: int m_nError;};ADOConn类的cpp文件: #include “stdafx.h” #include “ADOConn.h” #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__;#define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// ADOConn::ADOConn(){ memset(error,0,1024);} ADOConn::~ADOConn(){ } ////////////////////////////////////////////////////////////////////// // CADOException Class ////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CADOException::CADOException(char* pchMessage){ m_strMessage = pchMessage;m_nError = GetLastError();} BOOL CADOException::GetErrorMessage(LPTSTR
lpstrError,UINT nMaxError,PUINT pnHelpContext /*= NULL*/){
char text[200];if(m_nError == 0){ wsprintf(text, “%s error”,(const char*)m_strMessage);} else { wsprintf(text, “%s error #%d”,(const char*)m_strMessage, m_nError);} strncpy(lpstrError, text, nMaxError-1);return TRUE;} BOOL ADOConn::OnInitADOConn(LPCTSTR ConnStr){ ::CoInitialize(NULL);try { // 创建Connection对象
m_pConnection.CreateInstance(“ADODB.Connection”);// 设置连接字符串,必须是BSTR型或者_bstr_t类型 _bstr_t strConnect
=
_bstr_t(ConnStr);//“Provider=SQLOLEDB;Server=127.0.0.1;Database=EventLogg;uid=event;pwd=event;”;m_pConnection->Open(strConnect,“",”“,adModeUnknown);return TRUE;} // 捕捉异常 catch(_com_error e){ // 显示错误信息 TRACE(e.Description());// sprintf(error,”连接数据库失败 请检查连接字符串rn当前连接字符串为:%s“,ConnStr);// throw new CADOException(error);throw new CADOException(”连接数据库失败“);} } //执行SQL语句 包含update delete insert BOOL ADOConn::ExecuteSQL(LPCTSTR lpszSQL){ // _variant_t RecordsAffected;try { // Connection对象的Execute方法:(_bstr_t CommandText, // VARIANT * RecordsAffected, long Options)
// 其中CommandText是命令字串,通常是SQL命令。// 参数RecordsAffected是操作完成后所影响的行数,// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名
// adCmdProc-存储过程;adCmdUnknown-未知
m_pConnection->Execute(_bstr_t(lpszSQL),NULL,adCmdText);return true;} catch(_com_error e){ TRACE(e.Description());// sprintf(error,”t执行SQL语句失败rn SQL语句为:%s“,lpszSQL);// throw new CADOException(error);throw new CADOException(”执行SQL语句失败“);} } //执行SELECT语句,获得结果集,结果集放在m_pRecordset中 _RecordsetPtr& ADOConn::GetRecordSet(LPCTSTR lpszSQL){ try { // 创建记录集对象
m_pRecordset.CreateInstance(__uuidof(Recordset));// 取得表中的记录
m_pRecordset->Open(_bstr_t(lpszSQL),m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);} // 捕捉异常 catch(_com_error e){ // 显示错误信息 TRACE(e.Description());// sprintf(error,”t执行SELECT语句失败rnSELECT语句为:%s“,lpszSQL);// throw new CADOException(error);throw new CADOException(”执行SELECT语句失败“);} // 返回记录集 return m_pRecordset;} //获取某个字段的值
BOOL ADOConn::GetCollect(LPCTSTR Name,CString &lpDest){ VARIANT vt;try { vt = m_pRecordset->GetCollect(Name);/* _bstr_t bstr =(_bstr_t)vt;if(lpDest!= ”“){ strcpy(lpDest,bstr);}*/ if(vt.vt!=VT_NULL)lpDest=(LPCSTR)_bstr_t(vt);else lpDest=”“;} catch(_com_error e){ TRACE(e.Description());sprintf(error,”获取字段:%s值失败“,Name);throw new CADOException(error);} return TRUE;} //关闭数据库
BOOL ADOConn::CloseADOConnection(){ try { m_pConnection->Close();} catch(_com_error e){ TRACE(e.Description());sprintf(error,e.Description());throw new CADOException(”关闭数据库失败“);} return TRUE;} //关表
BOOL ADOConn::CloseTable(){ try { m_pRecordset->Close();} catch(_com_error e){ TRACE(e.Description());sprintf(error,e.Description());throw new CADOException(”关闭表失败“);} return TRUE;} //下一个
BOOL ADOConn::MoveNext(){ try { m_pRecordset->MoveNext();} catch(_com_error e){ TRACE(e.Description());sprintf(error,e.Description());throw new CADOException(”结果集移向下一个失败“);} return TRUE;} //尾
BOOL ADOConn::adoEOF(){ return m_pRecordset->adoEOF;} //头
BOOL ADOConn::adoBOF(){ return m_pRecordset->BOF;} //事务开始
BOOL ADOConn::BeginTrans(){ try { m_pConnection->BeginTrans();} catch(_com_error e){ TRACE(e.Description());sprintf(error,e.Description());throw new CADOException(”事务开始失败“);}
return TRUE;} //递交事务
BOOL ADOConn::CommitTrans(){ try { m_pConnection->CommitTrans();} catch(_com_error e){ TRACE(e.Description());sprintf(error,e.Description());throw new CADOException(”递交事务失败“);} return TRUE;} //事务回滚
BOOL ADOConn::RollbackTrans(){ try { m_pConnection->RollbackTrans();} catch(_com_error e){ TRACE(e.Description());sprintf(error,e.Description());throw new CADOException(”回滚事务失败");} return TRUE;}
第二篇:ADO编程模型之VB数据库操作小结
ADO编程模型之VB数据库操作小结
使用ADO编程模型需添加ADO对象类库的“引用”----“Microsoft ActiveX Data Objects 2.x Library” ADO之VB数据库操作主要包括读、写、修改及删除等操作,不论是进行什么数据库操作都必须首先连接到数据库。
一、连接到数据库
1、连接到SQL数据库:
通过ADO的Connection对象可实现VB与SQL数据库的连接。一般方法如下:
Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象
cnn.ConnectionString = “Provider=SQLOLEDB.1;Password=密码;User ID=用户名;Initial Catalog=SQL数据库文件;Data Source= localhost;”
'指定提供者,设置数据源 cnn.Open
‘打开到数据库的连接 ……..cnn.Close
‘关闭到数据库的连接 或者:
Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象
cnn.Open “Provider=SQLOLEDB.1;Password=密码;User ID=用户名;Initial Catalog=SQL数据库文件;Data Source= localhost;”
‘打开到数据库的连接 ……..cnn.Close
‘关闭到数据库的连接
2、连接到ACCESS数据库:
通过ADO的Connection对象可实现VB与ACCESS数据库的连接。一般方法如下:
Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象
cnn.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=ACCESS数据库文件.MDB” '指定提供者,设置数据源
cnn.Open
‘打开到数据库的连接 ……..cnn.Close
‘关闭到数据库的连接 或者: Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象 cnn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=ACCESS
数据库文件.MDB”
‘打开到数据库的连接 ……..cnn.Close
‘关闭到数据库的连接
二、读数据库操作
读数据库操作一般可通过recordset对象实现。方法如下—以ACCESS数据库为例:
Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象 cnn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=ACCESS
数据库文件.MDB”
‘打开到数据库的连接
Dim rs As New Recordset
'声明一个记录集对象
rs.Open [记录源, cnn, 游标类型, 锁定类型, 命令类型]
‘也可先设置记录集相关属性
text1.text= rs(“字段名称1或索引”)
‘假设读取出来的字段信息显示在文本框中,三种读取方法等价 text2.text=rs.fields(“字段名称2或索引”)text3.text= rs!字段名称3 …….rs.close
‘关闭记录集对象 cnn.Close
‘关闭与数据库的连接 set rs=Nothing
‘释放rs对象实例 set cnn=Nothing ‘释放Connection对象实例
记录源一般为一条SQL查询语句,以实现查询目的。
Recordset对象还保持查询返回的记录的位置,它返回第一个检索到的记录,并允许你一次一项逐步扫描其他结果。Recordset对象的部分属性及方法如下 Rs(i): 读取第i个字段的数据,i从0开始 Rs(字段名): 读取指定字段的数据 Rs.EOF:记录指针指到记录的尾部 Rs.BOF:记录指针指到记录的头部 Rs.RecordCount: 游标中的数据记录总数
Rs.PageSize:当对象设有分页时,用于指定逻辑页中的记录个数 Rs.PageCount:返回记录集中的逻辑分页数 Rs.MoveNext: 将记录指针移到下一个记录 Rs.MovePrev: 将记录指针移到上一个记录 Rs.MoveFirst: 将记录指针移到第一个记录 Rs.MoveLast: 将记录指针移到最后一个记录 rs.Delete:将当前记录删除 rs.addnew:添加一条新记录(行)
如果要读取满足条件的数据库记录,只要在SELECT语句中增加WHERE子句即可(例如:WHERE 性别=”男”),如果要读取多条满足条件的数据库记录,可通过循环语句来实现,并且每读取一条记录后使用Rs.MoveNext移动记录指针以读取下一条记录。
三、写数据库操作
方法1:使用recordset对象(此方法一般初学者使用较多)。方法如下—以ACCESS数据库为例: Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象 cnn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=ACCESS
数据库文件.MDB”
‘打开到数据库的连接
Dim rs As New Recordset
'声明一个记录集对象
rs.Open [记录源, cnn, 游标类型, 锁定类型, 命令类型]
‘也可先设置记录集相关属性 rs.addnew ‘告诉rs我们要添加一行
rs(“字段名称1或索引”)=值1
‘给要添加的行的一个字段赋值,三种方法等价 rs.fields(“字段名称2或索引”)=值2 rs!字段名称3 =值3 …….rs.update
‘通知rs我们要把这个行写入数据库 rs.close
‘关闭记录集对象 cnn.Close
‘关闭与数据库的连接 set rs=Nothing
‘释放rs对象实例 set cnn=Nothing ‘释放Connection对象实例
addnew使用方法后,如果要放弃添加的结果,应调用记录集的CancelUpdate方法放弃。
方法2:使用Connection对象的Execute方法对表进行SQL记录插入操作(要求要熟悉SQL命令)Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象 cnn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=ACCESS
数据库文件.MDB”
‘打开到数据库的连接
strSQL = “Insert Into 数据表(字段1, 字段2…..)Values(值1, 值2…..)
‘拼写Insert插入语句 cnn.Execute strSQL
'执行Insert语句实现添加 …….cnn.Close
‘关闭与数据库的连接
set cnn=Nothing ‘释放Connection对象实例
四、修改数据库操作
方法1:使用recordset对象(此方法一般初学者使用较多)。方法如下—以ACCESS数据库为例: Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象 cnn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=ACCESS
数据库文件.MDB“
‘打开到数据库的连接
Dim rs As New Recordset
'声明一个记录集对象
rs.Open [记录源, cnn, 游标类型, 锁定类型, 命令类型]
‘也可先设置记录集相关属性 …….rs(”字段名称1或索引“)=新值1
‘‘给要修改的行的一个字段赋一个新值,三种方法等价 rs.fields(”字段名称2或索引“)=新值2 rs!字段名称3 =新值3 …….rs.update
‘通知rs,我们要把修改好的记录行写入数据库 rs.close
‘关闭记录集对象 cnn.Close
‘关闭与数据库的连接 set rs=Nothing
‘释放rs对象实例 set cnn=Nothing ‘释放Connection对象实例
如果放弃修改结果,应调用记录集的CancelUpdate方法放弃更新数据库。
方法2:使用Connection对象的Execute方法对表进行SQL记录更新操作(要求要熟悉SQL命令)Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象 cnn.Open ”Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=ACCESS
数据库文件.MDB“
‘打开到数据库的连接
strSQL = ”Update 数据表 Set 字段1=新值1, 字段2=新值2…..‘拼写Update语句,以便进行修改 cnn.Execute strSQL
'执行Insert语句实现添加 …….cnn.Close
‘关闭与数据库的连接
set cnn=Nothing ‘释放Connection对象实例
五、删除数据库操作
方法1:使用recordset对象(此方法一般初学者使用较多)。方法如下—以ACCESS数据库为例方法1:通过 Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象 cnn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=ACCESS
数据库文件.MDB”
‘打开到数据库的连接
Dim rs As New Recordset
'声明一个记录集对象
rs.Open [记录源, cnn, 游标类型, 锁定类型, 命令类型]
‘也可先设置记录集相关属性 …….rs.Delete
‘删除当前记录 …….rs.update
‘通知rs,我们要把修改好的记录行写入数据库 rs.close
‘关闭记录集对象 cnn.Close
‘关闭与数据库的连接 set rs=Nothing
‘释放rs对象实例 set cnn=Nothing ‘释放Connection对象实例
删除数据库记录前应先找到(查询)待删除的记录项(通过rs.Open来实现)。
方法2:使用Connection对象的Execute方法(要求使用者要熟悉SQL命令)例如:如果要将数据库“成绩.mdb”中的名字为“学生情况表”的数据表中,学号为'07001'的记录删除,可通过下列方法来实现。
Dim cnn As New ADODB.Connection ‘创建Connection对象cnn,关键字new用于创建新对象 cnn.Open “Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=ACCESS
数据库文件.MDB”
‘打开到数据库的连接
sql=“delete from学生情况表where 学号='07001'”
‘拼写delete语句,以便进行删除
cnn.Execute strSQL
'执行elete语句实现删除 …….cnn.Close
‘关闭与数据库的连接
set cnn=Nothing ‘释放Connection对象实例
附:分页简介---使用记录集
一、.原理:
分页其实是将数据库中的记录分割成若干段,并将各段记录放在同一个“逻辑页面”上“分屏显示”出来,其实显示的“逻辑页面”只有1页,只是每次显示的页面记录不同罢了。通过控制各页中数据库显示记录的不同,来刷新页面的显示内容。
二、用到的几个记录集属性
rs.pagesize:定义一页显示记录的条数; rs.recordcount:统计数据库记录总数; rs.pagecount:统计总页数;
rs.absolutepage:将数据库指针移动到当前页要显示的数据记录的第一条记录;比如有20条记录的一个数据库,我们分为一页显示5条记录,如将AbsolutePage属性设为2,则当前记录指针移至第2页第1条记录,也即将指针移动到第6条记录处,依次类推....(AbsolutePage 属性是以 1 为起始的)