Ado是以com的形式来进行提供,所以他的许多行为都必须支持com的规范,在进行Ado操作之前必须将ado的com对象引入到项目当中。
引入
#import "C:\Program Files\CommonFiles\System\ADO\msado15.dll" \
no_namespace rename("EOF","EndOfFile")
但要注意不能放在stdAfx.h文件的开头,而应该放在所有include指令的后面。否则在编译时会出错。
程序在编译过程中,VC++会读出msado15.dll中的类型库信息,自动产生两个该类型库的头文件和实现文件msado15.tlh和msado15.tli(在您的Debug或Release目录下)。在这两个文件里定义了ADO的所有对象和方法,以及一些枚举型的常量等。我们的程序只要直接调用这些方法就行了,与使用MFC中的COleDispatchDriver类调用Automation对象十分类似。
在引入之后对com对象进行初始化CoInitialize(NULL)
ado的三个关键对象
在c++有关数据库的操作之中有三个非常养分的对象,分别有连接对象(_Connection)、命令对象(_Command)和记录集对象(_RecordSet),这三个对象封装了数据库核心的操作。
_Connection:负责对数据库进行连接和管理。
_Connection对象的创建
_ConnectionPtr sqlSp; //创建一个_ConnectionPtr用来做对数据库的操作
//创建对象的实例,并且将结果反馈给HRESULT对象
HRESULThr=sqlSp.CreateInstance(_uuidof(Connection));
/*
if(FAILED(hr))
{
cout<<"_ConnectionPtr对象指针实例化失败!!!"<<endl;
return;
}
*/
if(hr!=S_OK)//判断 sqlSp的对象实例化是否成功
{
cout<<"_ConnectionPtr对象指针实例化失败!!!"<<endl;
return;
}
定义连接字符串
_bstr_t strConnect="Driver={sqlserver};server=127.0.0.1,1433;uid=sa;pwd=sa;database=zy;";
上面定义了一个sql的连接字符串,其实server表示目标计算机的地址或者服务名,1433表示目标计算机的端口,uid表示sqlserver的用户名,pwd表示sqlserver的密码,database表示要操作的数据库名称
打开数据库的链接
sqlSp->Open(strConnect,"","",adModeUnknown);
adModeUnknown表示的是数据库连接的模式,通常来用设置其权限。adModeUnknown是默认的选项,表示当前的模式未确认,更多的细节可以参考msdn上的介绍http://msdn.microsoft.com/en-us/library/windows/desktop/ms675792(v=vs.85).aspx
_RecordsetPtr:记录集对象指针,用来执行SQL语句并记录查询结果。可以理解成,用户通过select查询语句查询数据里,将查询到的结果保存到该对象里面,然后对其进行遍历操作。
_RecordsetPtr m_pRecordset;//定义_ RecordsetPtr对象
//以下语句是对m_pRecordset对象进行实例化,并且操作是否成功
if(FAILED(m_pRecordset.CreateInstance(_uuidof( Recordset ))))
{
cout<<"记录集对象指针实例化失败!"<<endl;
return;
}
//通过调用open来打开数据库进行查询数据,以下红色代表的查询的语句。
m_pRecordset->Open("SELECT *FROM zyprocStatus",(IDispatch*)sqlSp,adOpenDynamic,adLockOptimistic,adCmdText);//打开数据库,执行SQL语句
//当用户已经查询完毕以后,可以通过以下方式来遍历数据库
m_pRecordset->MoveFirst();//定位到该数据集的第一行数据
while(!m_pRecordset->adoEOF)//判断是否遍历完成
{
//通过调用 m_pRecordset->Fields->GetItem(_variant_t("列名"))->Value 可以获得当前行的特定列数据
m_pRecordset->Fields->GetItem(_variant_t("tpReady"))->Value=_bstr_t("33");//将结果更改为33
m_pRecordset->Update();//更新当前的操作结果
stringbookname=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("tpReady"))->Value);
cout<<bookname<<endl;
m_pRecordset->MoveNext();//读取下一行数据
}
自定义SQL语句,用户可以调用_ConnectionPtr对象的Execute方法来自定义执行语句
_bstr_t bstrSQL;
bstrSQL="deletezyprocStatus where tpReady=22 ";
sqlSp->Execute(bstrSQL,NULL,adCmdText);
#include <icrsint.h>
#include<iostream>
#include<iomanip>
#include <string>
using namespace std;
#import "c:\programfiles\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
void main()
{
CoInitialize(NULL);
_ConnectionPtr sqlSp;
HRESULThr=sqlSp.CreateInstance(_uuidof(Connection));
/*
if(FAILED(hr))
{
cout<<"_ConnectionPtr对象指针实例化失败!!!"<<endl;
return ;
}
*/
if(hr!=S_OK)
{
cout<<"_ConnectionPtr对象指针实例化失败!!!"<<endl;
return ;
}
else {
try {
_bstr_t strConnect="Driver={sqlserver};server=127.0.0.1,1433;uid=sa;pwd=sa;database=zy;";
//_bstr_tstrConnect="Provider=SQLOLEDB;Server=127.0.0.1,1433;Database=PBMS;uid=sa;pwd=pp471006459;";
//_bstr_tstrConnect="Provider=SQLOLEDB.1;Password=pp471006459;Persist SecurityInfo=True;User ID=sa;"
//"InitialCatalog=PBMS;Data Source=127.0.0.1,1433";
//以上这三条strConnect语句都可以用!!看自己喜好选择用吧
//要注意修改用户名uid、密码pwd、数据库名database,这三个参数均是你自己sql server的数据库信息
sqlSp->Open(strConnect,"","",adModeUnknown);
}
catch(_com_error&e) {
cout<<e.Description()<<endl;
}
_RecordsetPtr m_pRecordset; //记录集对象指针,用来执行SQL语句并记录查询结果
if(FAILED(m_pRecordset.CreateInstance(_uuidof( Recordset ))))
{
cout<<"记录集对象指针实例化失败!"<<endl;
return;
}
//charstrSQL[]="SELECT * FROM Books";
try {
m_pRecordset->Open("SELECT * FROM zyprocStatus",(IDispatch*)sqlSp,adOpenDynamic,adLockOptimistic,adCmdText);//打开数据库,执行SQL语句
}
catch(_com_error &e)
{
cout <<e.Description()<<endl;
}
try {
m_pRecordset->MoveFirst();
while(!m_pRecordset->adoEOF)
{
//m_pRecordset->Fields->GetItem(_variant_t("tpReady"))->Value=_bstr_t("33");
m_pRecordset->Update();
string bookname=(char*)(_bstr_t)(m_pRecordset->Fields->GetItem(_variant_t("tpReady"))->Value);
cout<<bookname<<endl;
m_pRecordset->MoveNext();
}
}
catch(_com_error &e)
{
cout <<e.Description()<<endl;
}
}
_bstr_t bstrSQL;
bstrSQL="deletezyprocStatus where tpReady=22 ";
sqlSp->Execute(bstrSQL,NULL,adCmdText);
system("pause");
}