ADO接口

转自百度文库

ADO中最重要的对象有三个:Connection、Recordset和Command,分别表示连接对象、记录集对象和命令对象。

三个对象对应的智能指针分别是:_ConnectionPtr、_RecordsetPtr、_CommandPtr。

ADO使用_ConnectionPtr这个指针来操纵Connection对象,类似地,后面用到的_CommandPtr和_RecordsetPtr分别表示命令对象指针和记录集对象指针。

Connection对象是这三个对象的基础,它的主要作用是建立与数据库的连接,建立了与数据库的连接后,才能进行其它有关数据库的访问和操作。也就是说,使用ADO操作数据库,通常先用Connection对象的Open方法打开一个库连接,然后才能进行数据库的操作。操作完成后,要关闭这个库连接。

本文只讲述Connection对象最常用的Open方法和Execute方法。

注意:在使用ADO进行操作之前,必须使用AfxOleInit()函数来进行初始化;

1. Open()方法

用于打开一个库连接,而Execute()方法一般用于执行一条SQL语句。

_ConnectionPtr智能指针的用法:

首先定义一个Connection类型的指针,然后调用CreateInstance()来创建一个连接对象的实例,再调用Open()函数建立与数据源的连接。

在建立连接对象后,可以使用连接对象的Execute()函数来执行SQL命令。

_ConnectionPtr智能指针Open()方法的原型:

Open(_bstr_t ConnectionString,_bstr_t UserID,_bstr_t Password,long Options)

ConnectionString为连接字串,UserID是用户名,Password是登陆密码

Options是连接选项,可以是如下几个常量:

    1> adModeUnknown 缺省,当前的许可权未设置

     2> adModeRead 只读

     3> adModeWrite 只写

     4> adModeReadWrite 可以读写

     5> adModeShareDenyRead 阻止其它Connection对象以读权限打开连接

     6> adModeShareDenyWrite 阻止其它Connection对象以写权限打开连接

     7> adModeShareExclusive 阻止其它Connection对象打开连接

     8> adModeShareDenyNone 阻止其它程序或对象以任何权限建立连接

2. Execute方法

函数原型:

_RecordsetPtr Connection::Execute(_bstr_t CommandText,VARIANT* RecordsAffected,long Options)

参数:

CommandText是命令字串,通常是SQL命令,

RecordsAffected是操作完成后所影响的行数

Options表示CommandText中内容的类型,可以取下列值之一:

    1> adCmdText 表明CommandText是文本命令

    2>adCmdTable 表明CommandText是一个表名

    3>adCmdProc 表明CommandText是一个存储过程

    4>adCmdUnknown 未知

Execute执行完后返回一个指向记录集的指针(_ResultsetPtr类型)

3. 异常捕获

出现的异常为:_com_error

例程CREATE_DB_AND_TABLE中已经使用了_ConnectionPtr指针的Open方法和Execute方法,在后面的例程我们将进一步详细说明。

例程

ConnPtr_Open_Exe

打开VC++ 6.0,新建一个基于对话框的工程ConnPtr_Open_Exe。在对话框IDD_CONNPTR_OPEN_EXE_DIALOG中进行编辑:

使用三个Group Box分成三个部分,第一部分演示使用Execute()函数来执行INSERT INTO命令;第二部分演示使用Execute()函数来执行Update命令;第三部分演示使用Execute()函数来执行SELECT命令。其中,第一部分和第二部分不需要返回记录集,第三部分演示返回记录集显示结果。

该对话框几个控件如下:

控件名称    ID                                            用途

按钮           IDC_BTN_INSERT_INTO  执行INSERT INTO语句

按钮           IDC_BTN_UPDATE             执行Update语句

按钮           IDC_BTN_SELECT            执行SELECT语句

列表框       IDC_LIST1                           显示SELECT语句执行结果

使用ClassWizard给列表框IDC_LIST1创建CListBox变量m_list1:

双击IDC_BTN_INSERT_INTO按钮,并编辑OnBtnInsertInto()函数如下:

  1. void CConnPtr_Open_ExeDlg::OnBtnInsertInto()   
  2. {  
  3.     _ConnectionPtr m_pConnection;  
  4.     _variant_t RecordsAffected;  
  5.     try  
  6.     {  
  7.         m_pConnection.CreateInstance(__uuidof(Connection));  
  8.         m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  
  9.     }  
  10.     catch(_com_error e)  
  11.     {  
  12.         CString errormessage;  
  13.         errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());  
  14.         AfxMessageBox(errormessage);  
  15.         return;  
  16.     }  
  17.   
  18.     try  
  19.     {  
  20.         _bstr_t strCmd="INSERT INTO Employees(EmployeeID,FirstName,LastName,HireDate,City,Country) VALUES(10,'Mary','Williams','15/4/1993 12:00:00','New York','USA')";  
  21.         m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  
  22.     }  
  23.     catch(_com_error &e)  
  24.     {  
  25.         AfxMessageBox(e.Description());  
  26.     }  
  27.     if(m_pConnection->State)  
  28.     {  
  29.         m_pConnection->Close();  
  30.     }  
  31. }  
void CConnPtr_Open_ExeDlg::OnBtnInsertInto() 

{

	_ConnectionPtr m_pConnection;

	_variant_t RecordsAffected;

	try

	{

		m_pConnection.CreateInstance(__uuidof(Connection));

		m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);

	}

	catch(_com_error e)

	{

		CString errormessage;

		errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());

		AfxMessageBox(errormessage);

		return;

	}



	try

	{

		_bstr_t strCmd="INSERT INTO Employees(EmployeeID,FirstName,LastName,HireDate,City,Country) VALUES(10,'Mary','Williams','15/4/1993 12:00:00','New York','USA')";

		m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);

	}

	catch(_com_error &e)

	{

		AfxMessageBox(e.Description());

	}

	if(m_pConnection->State)

	{

		m_pConnection->Close();

	}

}

双击IDC_BTN_UPDATE按钮,并编辑OnBtnUpdate()函数如下:

  1. void CConnPtr_Open_ExeDlg::OnBtnUpdate()   
  2. {  
  3.     _ConnectionPtr m_pConnection;  
  4.     _variant_t RecordsAffected;  
  5.     try  
  6.     {  
  7.         m_pConnection.CreateInstance(__uuidof(Connection));  
  8.         m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  
  9.     }  
  10.     catch(_com_error e)  
  11.     {  
  12.         CString errormessage;  
  13.         errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());  
  14.         AfxMessageBox(errormessage);  
  15.         return;  
  16.     }  
  17.   
  18.     try  
  19.     {  
  20.         _bstr_t strCmd="UPDATE Employees SET FirstName='Bill',LastName='Clinton',HireDate='25/11/1994 12:00:00',City='Los Angeles' WHERE EmployeeID=10";  
  21.         m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  
  22.     }  
  23.     catch(_com_error &e)  
  24.     {  
  25.         AfxMessageBox(e.Description());  
  26.     }  
  27.   
  28.     if(m_pConnection->State)  
  29.     {  
  30.         m_pConnection->Close();   
  31.     }  
  32. }  
void CConnPtr_Open_ExeDlg::OnBtnUpdate() 

{

	_ConnectionPtr m_pConnection;

	_variant_t RecordsAffected;

	try

	{

		m_pConnection.CreateInstance(__uuidof(Connection));

		m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);

	}

	catch(_com_error e)

	{

		CString errormessage;

		errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());

		AfxMessageBox(errormessage);

		return;

	}



	try

	{

		_bstr_t strCmd="UPDATE Employees SET FirstName='Bill',LastName='Clinton',HireDate='25/11/1994 12:00:00',City='Los Angeles' WHERE EmployeeID=10";

		m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);

	}

	catch(_com_error &e)

	{

		AfxMessageBox(e.Description());

	}



	if(m_pConnection->State)

	{

		m_pConnection->Close(); 

	}

}

双击IDC_BTN_SELECT按钮,并编辑OnBtnSelect()函数如下:

  1. void CConnPtr_Open_ExeDlg::OnBtnSelect()   
  2. {  
  3.     _ConnectionPtr m_pConnection;  
  4.     _variant_t RecordsAffected;  
  5.     _RecordsetPtr m_pRecordset;  
  6.     try  
  7.     {  
  8.         m_pConnection.CreateInstance(__uuidof(Connection));  
  9.         m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);  
  10.     }  
  11.     catch(_com_error e)  
  12.     {  
  13.         CString errormessage;  
  14.         errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());  
  15.         AfxMessageBox(errormessage);  
  16.         return;  
  17.     }  
  18.     try  
  19.     {  
  20.         m_pRecordset.CreateInstance("ADODB.Recordset"); //为Recordset对象创建实例  
  21.         _bstr_t strCmd="SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'";  
  22.         m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);  
  23.     }  
  24.     catch(_com_error &e)  
  25.     {  
  26.         AfxMessageBox(e.Description());  
  27.     }  
  28.     _variant_t vEmployeeID,vFirstName,vLastName,vHireDate,vCity;  
  29.     try  
  30.     {  
  31.         while(!m_pRecordset->adoEOF)  
  32.         {  
  33.             vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));  
  34.             //取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行  
  35.             vFirstName=m_pRecordset->GetCollect("FirstName");  
  36.             vLastName=m_pRecordset->GetCollect("LastName");  
  37.             vHireDate=m_pRecordset->GetCollect("HireDate");  
  38.             vCity=m_pRecordset->GetCollect("City");  
  39.             CString strtemp;  
  40.             if(vEmployeeID.vt!=VT_NULL)  
  41.             {  
  42.                 strtemp.Format("%d",vEmployeeID.lVal);  
  43.             }  
  44.             if(vFirstName.vt!=VT_NULL)  
  45.             {  
  46.                 strtemp+=" ";  
  47.                 strtemp+=(LPCTSTR)(_bstr_t)vFirstName;  
  48.             }  
  49.             if(vLastName.vt!=VT_NULL)  
  50.             {  
  51.                 strtemp+=" ";  
  52.                 strtemp+=(LPCTSTR)(_bstr_t)vLastName;  
  53.             }  
  54.             if(vHireDate.vt!=VT_NULL)  
  55.             {  
  56.                 strtemp+=" ";  
  57.                 strtemp+=(LPCTSTR)(_bstr_t)vHireDate;  
  58.             }  
  59.             if(vCity.vt!=VT_NULL)  
  60.             {  
  61.                 strtemp+=" ";  
  62.                 strtemp+=(LPCTSTR)(_bstr_t)vCity;  
  63.             }  
  64.   
  65.             m_list1.AddString(strtemp);  
  66.             m_list1.AddString("\n");  
  67.   
  68.             //移动到下一条记录  
  69.             m_pRecordset->MoveNext();  
  70.         }  
  71.     }  
  72.     catch(_com_error &e)  
  73.     {  
  74.         AfxMessageBox(e.Description());  
  75.     }  
  76.   
  77.     m_pRecordset->Close();  
  78.     m_pRecordset=NULL;  
  79.     m_pConnection->Close();   
  80.     m_pConnection=NULL;  
  81. }  
void CConnPtr_Open_ExeDlg::OnBtnSelect() 

{

	_ConnectionPtr m_pConnection;

	_variant_t RecordsAffected;

	_RecordsetPtr m_pRecordset;

	try

	{

		m_pConnection.CreateInstance(__uuidof(Connection));

		m_pConnection->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Northwind.mdb","","",adModeUnknown);

	}

	catch(_com_error e)

	{

		CString errormessage;

		errormessage.Format("连接数据库失败!\r错误信息:%s",e.ErrorMessage());

		AfxMessageBox(errormessage);

		return;

	}

	try

	{

		m_pRecordset.CreateInstance("ADODB.Recordset"); //为Recordset对象创建实例

		_bstr_t strCmd="SELECT EmployeeID,FirstName,LastName,HireDate,City FROM Employees WHERE City='London'";

		m_pRecordset=m_pConnection->Execute(strCmd,&RecordsAffected,adCmdText);

	}

	catch(_com_error &e)

	{

		AfxMessageBox(e.Description());

	}

	_variant_t vEmployeeID,vFirstName,vLastName,vHireDate,vCity;

	try

	{

		while(!m_pRecordset->adoEOF)

		{

			vEmployeeID=m_pRecordset->GetCollect(_variant_t((long)0));

			//取得第1列的值,从0开始计数,你也可以直接列出列的名称,如下一行

			vFirstName=m_pRecordset->GetCollect("FirstName");

			vLastName=m_pRecordset->GetCollect("LastName");

			vHireDate=m_pRecordset->GetCollect("HireDate");

			vCity=m_pRecordset->GetCollect("City");

			CString strtemp;

			if(vEmployeeID.vt!=VT_NULL)

			{

				strtemp.Format("%d",vEmployeeID.lVal);

			}

			if(vFirstName.vt!=VT_NULL)

			{

				strtemp+=" ";

				strtemp+=(LPCTSTR)(_bstr_t)vFirstName;

			}

			if(vLastName.vt!=VT_NULL)

			{

				strtemp+=" ";

				strtemp+=(LPCTSTR)(_bstr_t)vLastName;

			}

			if(vHireDate.vt!=VT_NULL)

			{

				strtemp+=" ";

				strtemp+=(LPCTSTR)(_bstr_t)vHireDate;

			}

			if(vCity.vt!=VT_NULL)

			{

				strtemp+=" ";

				strtemp+=(LPCTSTR)(_bstr_t)vCity;

			}



			m_list1.AddString(strtemp);

			m_list1.AddString("\n");



			//移动到下一条记录

			m_pRecordset->MoveNext();

		}

	}

	catch(_com_error &e)

	{

		AfxMessageBox(e.Description());

	}



	m_pRecordset->Close();

	m_pRecordset=NULL;

	m_pConnection->Close(); 

	m_pConnection=NULL;

}

附加操作(重要):

1> 在stdafx.h中加入如下语句:

#import "C:\Program Files\Common Files\system\ado\msado15.dll" rename("EOF","adoEOF")

2> 在BOOL CConnPtr_Open_ExeApp::InitInstance()函数中加入:

AfxOleInit();

该部分演示了如何使用_ConnectionPtr接口开发ACCESS数据库:先创建一个Connection对象实例,然后用Open方法打开一个库连接,最后使用Execute方法执行SQL语句进行其它有关数据库的访问和操作。

你可能感兴趣的:(接口)