您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据结构与算法 > 第七讲用ADO技术实现对数据库的查询操作
第七讲:用ADO技术实现对数据库的查询操作上一讲我们已经学会了如何使用ADO中的Excute函数执行非查询的数据库操作,那么我们如何才能够实现在应用程序中执行SELECT查询操作,并且将数据库中查询到的结果返回到应用程序中好让我们使用C++进行操作呢?接下来让我们一起来看看吧!【ADO实现查询操作的原理】在上一讲中我们学习到可以通过Connection对象以及Command对象中的Excute函数执行SQL语句实现非查询的数据库操作。同样的,我们也可以使用Excute函数执行SQL实现查询的数据库操作。当然这并不是重点所在,重点是我们使用SELECT语句对数据库进行查询之后将会得到查询结果,而这些查询结果是单纯的保存在数据库中的,应用程序不能够直接得到。那么如何才能够获得这些查询的数据呢?在ADO技术中,我们通过Recordset(记录集)对象保存这些查询的数据,而这些数据将会通过Excute返回值的形式返回到记录集中。我们若想使用Recordset对象,就必须要使用与Recordset相关的智能指针类型。在C++中,使用_RecordsetPtr类型表示智能指针。【_RecordsetPtr智能指针】_RecordsetPtr智能指针是在ADO技术中使用的特殊的智能指针类型,它指向用于保存查询结果的Recordset对象。通常我们在执行SQL语句进行查询时,所返回的结果是一张表格(即使是一个单元格也一样),故此Recordset对象也采用表格的存储方式将数据库服务器中查询到的结果返回到应用程序中。【实现查询操作的步骤】Step1:建立可靠的数据库连接Step2:通过Excute函数执行相关的SQL语句,并使用Recordset对象的智能指针对象接收Excute函数执行的返回值Step3:通过_RecordsetPtr读取记录集中的内容【获取记录集】那么如何获取查询的记录集呢?其实很简单,我们只需要在执行查询时,使用一个_RecordsetPrt类型的智能指针对象接收Excute函数的返回值即可。代码如下:Records=MyConnection-Execute(CommandString,&Count,adCmdText);其中Records是使用_RecordsetPtr定义的智能指针对象,CommandString是需要被执行的查询操作。[例]查询数据库中所有学生的信息,并接收结果集#includeiostream#includeafx.h#includeconio.h#importC:\ProgramFiles\CommonFiles\System\ado\msado15.dllno_namespacerename(EOF,adoEOF)usingnamespacestd;voidmain(){_bstr_tConnectionString=Provider=SQLOLEDB.1;IntegratedSecurity=SSPI;PersistSecurityInfo=False;UserID=sa;InitialCatalog=Student;DataSource=(local);//定义连接字符串_bstr_tCommandString=select*fromStudent_INF;//定义命令字符串_ConnectionPtrMyConnection;//定义连接指针_RecordsetPtrRecords=NULL;//定义记录集指针_variant_tCount;//定义影响行数变量//初始化COM编程环境if(FAILED(::CoInitialize(NULL))){cout初始化COM环境失败!endl;getch();return;}MyConnection.CreateInstance(_uuidof(Connection));//创建连接对象Records.CreateInstance(_uuidof(Recordset));//创建记录集对象MyConnection-ConnectionString=ConnectionString;//指定连接字符串MyConnection-ConnectionTimeout=10;//指定连接超时为10stry{MyConnection-Open(,,,adConnectUnspecified);//打开连接if(MyConnection-State==adStateOpen){cout数据库连接成功!endl;getch();}}catch(_com_errore){cout数据库连接失败!原因如下:endl;cout\te.ErrorMessage()endl;getch();return;}Records=MyConnection-Execute(CommandString,&Count,adCmdText);if(Records!=NULL)cout”获取记录集成功!”endl;elsecout”获取记录集失败!”endl;if(MyConnection-State==adStateClosed)MyConnection-Close();::CoUninitialize();//释放COM环境}【读取记录集中的数据】那么在获取了记录集之后我们又如何从记录集中取出相应的数据呢?此时我们需要先了解一下记录集中保存的表格的特性,应用程序通过SQL语句查询到的结果将会以表格的形式原封不动的封装为Recordset对象并返回到应用程序中。而我们为了读取Recordset就必须要构造与我们所查询的表格相同的类,通过类的对象以及动态数组将记录集中的结果保存下来。首先我们可以新建一个Student_INF类,其中的属性与数据库中Student_INF表中的属性相同。接下来让我们回顾一下构造Student_INF表格的SQL语句:createtableStudent_INF(IDvarchar(20)primarykey,Namevarchar(10),Ageint)此时我们可以观察到Student_INF表共有三个属性,因此我们所构建的Student_INF类也必须要具有这三个属性。具体代码如下:#pragmaonce#ifndefSTUDENT_INF_H//防止文件多次包含#defineSTUDENT_INF_H#includeiostream#includestringusingnamespacestd;classStudent_INF{public:Student_INF(void);~Student_INF(void);voidsetID(stringID){this-ID=ID;}stringgetID(){returnthis-ID;}voidsetName(stringName){this-Name=Name;}stringgetName(){returnthis-Name;}voidsetAge(intAge){this-Age=Age;}intgetAge(){returnthis-Age;}private:stringID;//学生学号stringName;//学生姓名intAge;//年龄};#endif限于篇幅,我们将摒弃其他已经学过的代码,专门研究一下如何在Recordset对象中取得数据。为了能够保存数据我们需要使用之前我们所学的动态数组CArray或者CList进行对结果的保存,这里我们使用大家较为熟悉的CArray类。代码如下:CArrayStudent_INF,Student_INFstudents;//创建动态数组那么接下来我们如何读取Recordset记录集中的数据呢?在此我们需要了解一下读取的原理。由于Recordset是以表格的形式记录数据的,因此在读取Recordset对象时通常采用逐行读取的方式进行,我们可以通过_RecordsetPtr类中的adoEOF属性判断是否读取到了表格的结尾,通过成员函数MoveNext移动到记录集的下一行。这和文件有些相似,因此我们可以大概的知道逐行读取Recordset对象的程序框架:while(!Records-adoEOF)//若记录集没有遍历到Recordset对象结尾{/*获取每行中每个单元格值的代码*/Records-MoveNext();//移动到下一行}接下来我们如何获得每个单元格中的数据呢?通常我们采用GetCollect函数完成这一操作。GetCollect函数仅有一个参数,那就是每一列的列名。通过列名我们可以获取每一行对应单元格的数据。此时我们可以通过新建Student_INF类型的对象temp将读取的结果暂存起来,再通过CArray的成员函数Add将该对象的值加入到动态数组中,具体代码如下:while(!Records-adoEOF)//若记录集没有遍历到最后一个元组{Student_INFtemp;//定义暂存数据的对象temp.setID((string)((_bstr_t)Records-GetCollect(ID)));//获取IDtemp.setName((string)((_bstr_t)Records-GetCollect(Name)));//获取姓名temp.setAge((int)((_variant_t)(Records-GetCollect(Age))));//获取年龄students.Add(temp);//将读取到的一行加入动态数组Records-MoveNext();//移动到下一个元组}【针对没有列名的表格的获取】上述的情况是建立在一张具有列名的表格中的,但有些时候我们也需要返回一些单个单元格不带列名的结果集,例如我们使用COUNT函数对表格进行查询时。故此我们需要学会如何读取这些不带列名的特殊表格。当然,读取他们的方法还是使用GetCollect函数,只是参数有了变化。由于这些特殊的表格并不具有列名,因此我们无法通过直接读取列名获取单元格中的数据。但是ADO考虑到了这一点,它将这些特殊的表格按照数组的模式进行排列,每一行的元素均含有一个下标,该下标均是从0开始,故此我们也可以使用这些特殊的下标进行记录的读取。代码如下:count=(int)((_variant_t)Records-GetCollect((_variant_t)(long)0));
本文标题:第七讲用ADO技术实现对数据库的查询操作
链接地址:https://www.777doc.com/doc-2119224 .html