ADO接口之_ConnectionPtr最常用的Open方法和Execute方法

本文深入讲解ADO中的Connection对象及其Open和Execute方法,介绍如何使用_ClassesPtr智能指针操作数据库,包括建立连接、执行SQL语句(插入、更新、查询)。同时,展示了VC++6.0环境下利用_ADO对象进行数据库操作的示例代码,涉及异常处理和记录集的使用。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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

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 阻止其它程序或对象以任何权限建立连接
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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 未知
1
2
3
4
5
6
7
Execute执行完后返回一个指向记录集的指针(_ResultsetPtr类型)

异常捕获
出现的异常为:_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()函数如下:

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();
}

}
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
双击IDC_BTN_UPDATE按钮,并编辑OnBtnUpdate()函数如下:

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()函数如下:

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;

}

Update

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()函数如下:

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语句进行其它有关数据库的访问和操作。

转载 ADO接口之_ConnectionPtr | 学步园 https://www.xuebuyuan.com/1836707.html

还是看一个简单的例子来理解一下吧

// TestADOSql.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h”
#include “iostream”
#include “string”
#include “vector”
//步骤1:添加对ADO的支持
#import “C:\Program Files\Common Files\System\ado\msado15.dll” no_namespace rename(“EOF”,“adoEOF”)
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL); //初始化COM环境
_ConnectionPtr pMyConnect(__uuidof(Connection));//定义连接对象并实例化对象
_RecordsetPtr pRst(__uuidof(Recordset));//定义记录集对象并实例化对象
try
{
//步骤2:创建数据源连接
/*打开数据库“SQLServer”,这里需要根据自己PC的数据库的情况 */
pMyConnect->Open(“Provider=SQLOLEDB; Server=.;Database=AIS2; uid=sa; pwd=;”,"","",adModeUnknown);
}
catch (_com_error &e)
{
cout<<“Initiate failed!”<<endl;
cout<<e.Description()<<endl;
cout<<e.HelpFile()<<endl;
return 0;
}
cout<<“Connect succeed!”<<endl;

//步骤3:对数据源中的数据库/表进行操作  
try             
{  
    pRst = pMyConnect->Execute("select * from gendat",NULL,adCmdText);//执行SQL: select * from gendat            
    if(!pRst->BOF)   
    {  
        pRst->MoveFirst();   
    }                 
    else  
    {                      
        cout<<"Data is empty!"<<endl;                       
        return 0;                  
    }                 
    vector<_bstr_t> column_name;        
       
    /*存储表的所有列名,显示表的列名*/                 
    for(int i=0; i< pRst->Fields->GetCount();i++)                 
    {                      
        cout<<pRst->Fields->GetItem(_variant_t((long)i))->Name<<" ";                      
        column_name.push_back(pRst->Fields->GetItem(_variant_t((long)i))->Name);                 
    }     
    cout<<endl;  
       
    /*对表进行遍历访问,显示表中每一行的内容*/                 
    while(!pRst->adoEOF)                 
    {                      
        vector<_bstr_t>::iterator iter=column_name.begin();                      
        for(iter;iter!=column_name.end();iter++)                      
        {                           
            if(pRst->GetCollect(*iter).vt !=VT_NULL)                           
            {    
                cout<<(_bstr_t)pRst->GetCollect(*iter)<<" ";                           
            }                           
            else  
            {  
                cout<<"NULL"<<endl;    
            }                    
        }  
        pRst->MoveNext();                     
        cout<<endl;                
    }             
}  
catch(_com_error &e)             
{                 
    cout<<e.Description()<<endl;                 
    cout<<e.HelpFile()<<endl;                 
    return 0;            
}    

//步骤4:关闭数据源  
/*关闭数据库并释放指针*/          
try             
{                 
    pRst->Close();     //关闭记录集                 
    pMyConnect->Close();//关闭数据库                 
    pRst.Release();//释放记录集对象指针                 
    pMyConnect.Release();//释放连接对象指针  
}  
catch(_com_error &e)             
{                 
    cout<<e.Description()<<endl;                 
    cout<<e.HelpFile()<<endl;                 
    return 0;             
}                    
CoUninitialize(); //释放COM环境  
return 0;  

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值