vc如何使用ado.docx

上传人:b****8 文档编号:11177183 上传时间:2023-02-25 格式:DOCX 页数:31 大小:34.31KB
下载 相关 举报
vc如何使用ado.docx_第1页
第1页 / 共31页
vc如何使用ado.docx_第2页
第2页 / 共31页
vc如何使用ado.docx_第3页
第3页 / 共31页
vc如何使用ado.docx_第4页
第4页 / 共31页
vc如何使用ado.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

vc如何使用ado.docx

《vc如何使用ado.docx》由会员分享,可在线阅读,更多相关《vc如何使用ado.docx(31页珍藏版)》请在冰豆网上搜索。

vc如何使用ado.docx

vc如何使用ado

VC如何使用ADO

VC用ADO访问数据库全攻略,介绍了VC用ADO来访问数据库的各个对象及各方法,很经典,也很实用,很值得一看。

 

正文 

一、ADO概述 

ADO是Microsoft为最新和最强大的数据访问范例OLEDB而设计的,是一个便于使用的应用程序层接口。

ADO使您能够编写应用程序以通过OLE.DB提供者访问和操作数据库服务器中的数据。

ADO最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。

ADO在关键的应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,所有这些都是为了提供轻量、高性能的接口。

之所以称为ADO,是用了一个比较熟悉的暗喻,OLE自动化接口。

OLEDB是一组”组件对象模型”(COM)接口,是新的数据库低层接口,它封装了ODBC的功能,并以统一的方式访问存储在不同信息源中的数据。

OLEDB是MicrosoftUDA(UniversalDataAccess)策略的技术基础。

OLEDB为任何数据源提供了高性能的访问,这些数据源包括关系和非关系数据库、电子邮件和文件系统、文本和图形、自定义业务对象等等。

也就是说,OLEDB并不局限于ISAM、Jet甚至关系数据源,它能够处理任何类型的数据,而不考虑它们的格式和存储方法。

在实际应用中,这种多样性意味着可以访问驻留在Excel电子数据表、文本文件、电子邮件/目录服务甚至邮件服务器,诸如MicrosoftExchange中的数据。

但是,OLEDB应用程序编程接口的目的是为各种应用程序提供最佳的功能,它并不符合简单化的要求。

您需要的API应该是一座连接应用程序和OLEDB的桥梁,这就是ActiveXDataObjects(ADO)。

二、在VC中使用ADO(开发步骤好下:

1、引入ADO库文件

使用ADO前必须在工程的stdafx.h头文件里用直接引入符号#import引入ADO库文件,以使编译器能正确编译。

代码如下所示:

用#import引入ADO库文件

#import"c:

\programfiles\commonfiles\system\ado\msado15.dll"no_namespacesrename("EOF"adoEOF")

这行语句声明在工程中使用ADO,但不使用ADO的名字空间,并且为了避免常数冲突,将常数EOF改名为adoEOF。

现在不需添加另外的头文件,就可以使用ADO接口了。

2、初始化OLE/COM库环境 

必须注意的是,ADO库是一组COM动态库,这意味应用程序在调用ADO前,必须初始化OLE/COM库环境。

在MFC应用程序里,一个比较好的方法是在应用程序主类的InitInstance成员函数里初始化OLE/COM库环境。

BOOLCMyAdoTestApp:

InitInstance() 

if(!

AfxOleInit())//这就是初始化COM库 

AfxMessageBox(“OLE初始化出错!

”); 

returnFALSE; 

}

……

}

3、ADO接口简介

ADO库包含三个基本接口:

_ConnectionPtr接口、_CommandPtr接口和_RecordsetPtr接口。

 

_ConnectionPtr接口返回一个记录集或一个空指针。

通常使用它来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。

使用_ConnectionPtr接口返回一个记录集不是一个好的使用方法。

对于要返回记录的操作通常用_RecordserPtr来实现。

而用_ConnectionPtr操作时要想得到记录条数得遍历所有记录,而用_RecordserPtr时不需要。

_CommandPtr接口返回一个记录集。

它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。

在使用_CommandPtr接口时,你可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。

如果你只执行一次或几次数据访问操作,后者是比较好的选择。

但如果你要频繁访问数据库,并要返回很多记录集,那么,你应该使用全局_ConnectionPtr接口创建一个数据连接,然后使用_CommandPtr接口执行存储过程和SQL语句。

_RecordsetPtr是一个记录集对象。

与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定,游标控制等。

同_CommandPtr接口一样,它不一定要使用一个已经创建的数据连接,可以用一个连接串代替连接指针赋给_RecordsetPtr的connection成员变量,让它自己创建数据连接。

如果你要使用多个记录集,最好的方法是同Command对象一样使用已经创建了数据连接的全局_ConnectionPtr接口 

,然后使用_RecordsetPtr执行存储过程和SQL语句。

4、使用_ConnectionPtr接口 

_ConnectionPtr主要是一个连接接口,取得与数据库的连接。

它的连接字符串可以是自己直接写,也可以指向一个ODBCDSN。

 

 _ConnectionPtrpConn; 

if(FAILED(pConn.CreateInstance("ADODB.Connection"))) 

AfxMessageBox("CreateInstancefailed!

"); 

return; 

}

CStringstrSRC; 

strSRC="Driver=SQLServer;Server="; 

strSRC+="suppersoft"; 

strSRC+=";Database="; 

strSRC+="mydb"; 

strSRC+=";UID=SA;PWD=";

CStringstrSQL="Insertintostudent(no,name,sex,address)values(3,'aaa','male','beijing')";

_variant_tvarSRC(strSRC); 

_variant_tvarSQL(strSQL); 

_bstr_tbstrSRC(strSRC);

if(FAILED(pConn->Open(bstrSRC,"","",-1))) 

AfxMessageBox("CannotopenDatabase!

"); 

pConn.Release(); 

return; 

}

COleVariantvtOptional((long)DISP_E_PARAMNOTFOUND,VT_ERROR);

pConn->Execute(_bstr_t(strSQL),&vtOptional,-1);

pConn.Release();

AfxMessageBox("ok!

");

5、使用_RecordsetPtr接口(以连接SQLServer为例) 

_RecordsetPtrpPtr; 

if(FAILED(pPtr.CreateInstance("ADODB.Recordset"))) 

AfxMessageBox("CreateInstancefailed!

"); 

returnFALSE; 

}

CStringstrSRC; 

strSRC="Driver=SQLServer;Server="; 

strSRC+="210.46.141.145"; 

strSRC+=";Database="; 

strSRC+="mydb"; 

strSRC+=";UID=sa;PWD="; 

strSRC+="sa";

CStringstrSQL="selectid,name,gender,addressfrompersonal";

_variant_tvarSRC(strSRC); 

_variant_tvarSQL(strSQL);

if(FAILED(pPtr->Open(varSQL,varSRC,adOpenStatic,adLockOptimistic,adCmdText))) 

AfxMessageBox("Opentablefailed!

"); 

pPtr.Release(); 

returnFALSE; 

}

while(!

pPtr->GetadoEOF()) 

_variant_tvarNo; 

_variant_tvarName; 

_variant_tvarSex; 

_variant_tvarAddress;

varNo=pPtr->GetCollect("id"); 

varName=pPtr->GetCollect("name"); 

varSex=pPtr->GetCollect("gender"); 

varAddress=pPtr->GetCollect("address");

CStringstrNo=(char*)_bstr_t(varNo); 

CStringstrName=(char*)_bstr_t(varName); 

CStringstrSex=(char*)_bstr_t(varSex); 

CStringstrAddress=(char*)_bstr_t(varAddress);

strNo.TrimRight(); 

strName.TrimRight(); 

strSex.TrimRight(); 

strAddress.TrimRight();

intnCount=m_list.GetItemCount(); 

intnItem=m_list.InsertItem(nCount,_T("")); 

m_list.SetItemText(nItem,0,strNo); 

m_list.SetItemText(nItem,1,strName); 

m_list.SetItemText(nItem,2,strSex); 

m_list.SetItemText(nItem,3,strAddress);

pPtr->MoveNext(); 

}

pPtr->Close(); 

pPtr.Release();

6、使用_CommandPtr接口 

_CommandPtr接口返回一个Recordset对象,并且提供了更多的记录集控制功能,以下代码示例了使用_CommandPtr接口的方法:

代码11:

使用_CommandPtr接口获取数据 

_CommandPtrpCommand; 

_RecordsetPtrpRs; 

pCommand.CreateInstance(__uuidof(Command)); 

pCommand->ActiveConnection=pConn; 

pCommand->CommandText="select*fromstudent"; 

pCommand->CommandType=adCmdText; 

pCommand->Parameters->Refresh(); 

pRs=pCommand->Execute(NULL,NULL,adCmdUnknown); 

_variant_tvarValue=pRs->GetCollect("name"); 

CStringstrValue=(char*)_bstr_t(varValue);

6、关于数据类型转换由于COM对象是跨平台的,它使用了一种通用的方法来处理各种类型的数据, 

因此Cstring类和COM对象是不兼容的,我们需要一组API来转换COM对象和C++类型的数据。

_vatiant_t和_bstr_t就是这样两种对象。

它们提供了通用的方法转换COM对象和C++类型的数据。

............................................................................................

1.生成应用程序框架并初始化OLE/COM库环境 

创建一个标准的MFCAppWizard(exe)应用程序,然后在使用ADO数据库的InitInstance函数中初始化OLE/COM库(因为ADO库是一个COMDLL库)。

 

本例为:

BOOLCAdotestDlg:

:

OnInitDialog() 

       :

:

CoInitialize(NULL);//初始化OLE/COM库环境 

 }

程序最后要调用:

:

CoUninitialize();//释放程序占用的COM资源。

另外:

m_pRecordset->Close();注意!

不要多次关闭!

 

m_pConnection->Close(); 

m_pRecordset=NULL; 

m_pConnection=NULL; 

2.引入ADO库文件

使用ADO前必须在工程的stdafx.h文件最后用直接引入符号#import引入ADO库文件,以使编译器能正确编译。

代码如下:

 

#import"C:

\ProgramFiles\commonfiles\system\ado\msado15.dll"no_namespacerename("EOF","adoEOF") 

ADO类的定义是作为一种资源存储在ADODLL(msado15.dll)中,在其内部称为类型库。

类型库描述了自治接口,以及C++使用的COMvtable接口。

当使用#import指令时,在运行时VisualC++需要从ADODLL中读取这个类型库,并以此创建一组C++头文件。

这些头文件具有.tli和.tlh扩展名,读者可以在项目的目录下找到这两个文件。

在C++程序代码中调用的ADO类要在这些文件中定义。

 

 程序的第三行指示ADO对象不使用名称空间。

在有些应用程序中,由于应用程序中的对象与ADO中的对象之间可能会出现命名冲突,所以有必要使用名称空间。

如果要使用名称空间,则可把第三行程序修改为:

rename_namespace("AdoNS")。

第四行代码将ADO中的EOF(文件结束)更名为adoEOF,以避免与定义了自己的EOF的其他库冲突。

3.利用智能指针进行数据库操作

在CaboutDlg头文件中定义两个ADO智能指针类实例,并在对话框中加入一个ListCtrl。

classCAdotestDlg:

publicCDialog 

    _ConnectionPtrm_pConnection; 

    _RecordsetPtrm_pRecordset; 

ClistCtrlm_List; 

    ...... 

}   

ADO库包含三个智能指针:

_ConnectionPtr、_CommandPtr和_RecordsetPtr。

_ConnectionPtr通常被用来创建一个数据连接或执行一条不返回任何结果的SQL语句,如一个存储过程。

 

_CommandPtr返回一个记录集。

它提供了一种简单的方法来执行返回记录集的存储过程和SQL语句。

在使用_CommandPtr接口时,可以利用全局_ConnectionPtr接口,也可以在_CommandPtr接口里直接使用连接串。

_RecordsetPtr是一个记录集对象。

与以上两种对象相比,它对记录集提供了更多的控制功能,如记录锁定、游标控制等。

在使用ADO程序的事件响应中OnButton1加入以下代码:

voidCAdotestDlg:

:

OnButton1() 

m_List.ResetContent(); 

m_pConnection.CreateInstance(_uuidof(Connection));//初始化Connection指针 

m_pRecordset.CreateInstance(_uuidof(Recordset));//初始化Recordset指针 

try 

 m_pConnection->Open("DSN=ADOTest","","",0);//连接叫作ADOTest的ODBC数据源 

 //注意:

这是连接不需要用户ID或密码的open函数 

 //否则形式为->Open("DSN=test;uid=sa;pwd=123;","","",0); 

 //执行SQL语句得到一个记录集把其指针赋值给m_pRecordset 

 CStringstrSql="select*frommiddle"; 

 BSTRbstrSQL=strSql.AllocSysString(); 

 m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConnection,adOpenDynamic,adLockOptimistic,adCmdText); 

 //adOpenDynamic:

动态adLockOptimistic乐观封锁法adCmdText:

文本查询语句 

 while(!

m_pRecordset->adoEOF)//遍历所有记录 

 { 

  //取纪录字段值方式之一 

  _variant_tTheValue;//VARIANT数据类型 

  TheValue=m_pRecordset->GetCollect("BIG_NAME");//得到字段BIG_NAME的值 

  if(TheValue.vt!

=VT_NULL) 

   m_List.AddString((char*)_bstr_t(TheValue)); 

  //将该值加入到列表控件中 

  //取纪录字段值方式之二 

  //_bstr_tTheValue1=m_pRecordset->Fields->GetItem("BIG_NAME")->Value; 

  //CStringtemp=TheValue1.copy(); 

  //m_List.AddString(temp); 

  //数据类型转换 

  _variant_tvUsername,vBirthday,vID,vOld; 

  TRACE("id:

%d,姓名:

%s,年龄:

%d,生日:

%s\r\n", 

  vID.lVal,(LPCTSTR)(_bstr_t)vUsername,vOld.lVal,(LPCTSTR)(_bstr_t)vBirthday);

  m_pRecordset->MoveNext();//转到下一条纪录 

 } 

 m_pRecordset->Close(); 

 m_pConnection->Close(); 

catch(_com_errore)//异常处理 

 AfxMessageBox(e.ErrorMessage()); 

m_pRecordset->Close();//注意!

不要多次关闭!

否则会出错 

m_pConnection->Close(); 

m_pRecordset=NULL; 

m_pConnection=NULL; 

}

程序中通过_variant_t和_bstr_t转换COM对象和C++类型的数据,_variant_t类封装了OLE自治VARIANT数据类型。

在C++中使用_variant_t类要比直接使用VARIANT数据类型容易得多。

好,编译后该程序就能运行了,但记住运行前要创建一个叫ADOTest的ODBC数据源。

该程序将把表middle中的BIG_NAME字段值显示在列表控件中。

在VisualC++中用ADO进行数据库编程(中) 

4.执行SQL命令并取得结果记录集

   为了取得结果记录集,我们定义一个指向Recordset对象的指针:

_RecordsetPtrm_pRecordset; 

并为其创建Recordset对象的实例:

m_pRecordset.CreateInstance("ADODB.Recordset"); 

SQL命令的执行可以采用多种形式,下面我们一进行阐述。

(1)利用Connection对象的Execute方法执行SQL命令

Execute方法的原型如下所示:

    _RecordsetPtrConnection15:

:

Execute(_bstr_tCommandText,VARIANT*RecordsAffected,longOptions)

    其中CommandText是命令字串,通常是SQL命令。

 

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

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

 

adCmdText:

表明CommandText是文本命令 

adCmdTable:

表明CommandText是一个表名 

adCmdProc:

表明CommandText是一个存储过程 

adCmdUnknown:

未知

   Execute执行完后返回一个指向记录集的指针,下面我们给出具体代码并作说明。

 

   _variant_tRecordsAffected; 

   ///执行SQL命令:

CREATETABLE创建表格users,users包含四个字段:

整形ID,字符串username,整形old,日期型birthday 

   m_pConnection->Execute("CREATETABLEusers(IDINTEGER,usernameTEXT,oldINTEGER,birthdayDATETIME)", 

  &RecordsAffected, 

  adCmdText);

   ///往表格里面添加记录 

   m_pConnection->Execute("INSERTINTOusers(ID,username,old,birthday)VALUES(1,''''Washington'''',25,''''1970/1/1'''')",&RecordsAffected,adCmdText);

   ///将所有记录old字段的值加一 

   m_pConnection->Execute("UPDATEusersSETold=old+1",&RecordsAffected,adCmdText);

   ///执行SQL统计命令得到包含记录条数的记录集 

   m_pRecordset= m_pConnection->Execute("SELECTCOUNT(*)FROMusers",&RecordsAffected,adCmdText); 

   _variant_tvIndex=(long)0; 

   _variant_tvCount=m_pRecordset->GetCollect(vIndex);///取得第一个字段的值放入vCount变量 

   上两句可以写成—_variant_tvCount=m_pRecordset->GetCollect((_variant_t)((long)0)); 

   m_pRecordset->Cl

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1