ADO 操作数据库(二)--基本对象Connection,Command和Recordset

    在前面的第一篇文章中,我们简单的介绍了ADO,以及它所包含的对象,现在我们将正式进入ADO的学习。

    此篇文章主要对ADO的三个基本对象Connection,Command和Recordset的相关重要函数进行介绍,其他函数会在此篇文章的“附录A”列出。当然此篇文章也会引入第一实例,在实例中我们将介绍如何导入ADO的库,并建立与数据库的连接,获取一个表中的数据。通过这些操作来理解整个连接与获取的过程。

    本想对MSDN上文章进行翻译的,结果发现有来至w3school.com.cn现成的,更专业的翻译。现在我们就可以将重心放在使用上了。在开始实例之前我们先简单介一下每个对象的功能。

Connection对象

    ADO Connection 对象用于创建一个到达某个数据源的开放连接。通过此连接,您可以对一个数据库进行访问和操作。如果需要多次访问某个数据库,您应当使用 Connection 对象来建立一个连接。您也可以经由一个 Command 或 Recordset 对象传递一个连接字符串来创建某个连接。不过,此类连接仅仅适合一次具体的简单的查询。

Command对象

ADO Command 对象用于执行面向数据库的一次简单查询。此查询可执行诸如创建、添加、取回、删除或更新记录等动作。如果该查询用于取回数据,此数据将以一个 RecordSet 对象返回。这意味着被取回的数据能够被 RecordSet 对象的属性、集合、方法或事件进行操作。Command 对象的主要特性是有能力使用存储查询和带有参数的存储过程。

Recordset对象

ADO Recordset 对象用于容纳一个来自数据库表的记录集。一个 Recordset 对象由记录和列(字段)组成。在 ADO 中,此对象是最重要且最常用于对数据库的数据进行操作的对象。当您首次打开一个 Recordset 时,当前记录指针将指向第一个记录,同时 BOF 和 EOF 属性为 False。如果没有记录,BOF 和 EOF 属性为 True。

Recordset 对象能够支持两种更新类型:
立即更新 - 一旦调用 Update 方法,所有更改被立即写入数据库。
批更新 - provider 将缓存多个更改,然后使用 UpdateBatch 方法把这些更改传送到数据库。
在 ADO,定义了 4 中不同的游标(指针)类型:

  • 动态游标 - 允许您查看其他用户所作的添加、更改和删除
  • 键集游标 - 类似动态游标,不同的是您无法查看有其他用户所做的添加,并且它会防止您访问其他用户已删除的记录。其他用户所做的数据更改仍然是可见的。
  • 静态游标 - 提供记录集的静态副本,可用来查找数据或生成报告。此外,由其他用户所做的添加、更改和删除将是不可见的。当您打开一个客户端 Recordset 对象时,这是唯一被允许的游标类型。
  • 仅向前游标 - 只允许在 Recordset 中向前滚动。此外,由其他用户所做的添加、更改和删除将是不可见的。

可通过 CursorType 属性或 Open 方法中的 CursorType 参数来设置游标的类型。
注释:并非所有的提供者(providers)支持 Recordset 对象的所有方法和属性。

实例:

    在使用ADO之前我们必须先导入ADO的库msado15.dll以及对COM的初始化, 此库默认放置在C:\Program Files\Common Files\System\ado\目录下。下面我们将以一个完整的实例来显示ADO的基本使用。

    首先,我们建立一个win32控制台的工程,命名为TestAdo。

    步骤1:在stdafx.h文件中导入msado15.dll库,当然也可以在其他文件中导入。

  1:  #import "C:\\Program Files\\Common Files\\System\\ado\\msado15.dll" \
  2:       no_namespace rename("EOF", "TableEnd")

   步骤2: 然后对COM进行初始化,不再使用的时候我们要对其进行卸载。

  1: if(::CoInitialize(NULL) < 0)
  2: {
  3:     cout<<"初始化Com失败!"<<endl;
  4:     return 0;
  5: }
  6: //开始使用各类对象
  7: //--------------------------------------------------------------------------------   
  8: //使用各类ADO对象   
  9: //--------------------------------------------------------------------------------
 10: //结束各类对象的使用 
 11: ::CoUninitialize();//卸载COM

步骤3:构建一些公共函数便于以后的操作,这些函数将在以后的实例中平凡的使用。

  • 检查创建是否成功的函数
  1: void TESTHR(HRESULT x)
  2: {
  3:     if FAILED(x) 
  4:        _com_issue_error(x);
  5: };
  • 打印记录集函数

  1: //********************************************************************************
  2: void PrintTableHeader(_RecordsetPtr& pTable)
  3: {
  4:   const int nFildesCount = pTable->Fields->Count;
  5:   cout<<right<<"============================================================================";
  6:   cout<<left<<endl;
  7:   for (int i = 0; i < nFildesCount; ++i)
  8:   {    
  9:     if (i < nFildesCount - 1)
 10:     {
 11:       cout<<setw(COLUMN_PITCH);
 12:     }
 13:     else
 14:     {
 15:       cout<<setw(0);
 16:     }
 17:     cout<<(_bstr_t)pTable->Fields->GetItem(long(i))->Name;    
 18:   }
 19:   cout<<endl<<"============================================================================"<<endl;
 20: }
 21: //********************************************************************************
 22: void PrintTableRecords(_RecordsetPtr& pTable)
 23: {
 24:   if (pTable->BOF == TRUE && pTable->TableEnd == TRUE)
 25:   {
 26:     return;
 27:   }
 28:   pTable->MoveFirst();
 29:   const int nFildesCount = pTable->Fields->Count;
 30:   cout<<left;
 31:   while (!pTable->TableEnd)
 32:   {
 33:     for (int j = 0; j < nFildesCount; ++j)
 34:     {  
 35:       if (j  < nFildesCount - 1)
 36:       {
 37:         cout<<setw(COLUMN_PITCH);
 38:       }
 39:       else
 40:       {
 41:         cout<<setw(0);
 42:       }
 43:       _variant_t values = pTable->GetCollect(long(j));
 44: 
 45:       if (values.vt != VT_NULL)
 46:       {
 47:         cout<<(_bstr_t)values;        
 48:       }
 49:       else
 50:       {
 51:         cout<<"NULL";        
 52:       }      
 53:     }
 54:     cout<<endl;
 55:     pTable->MoveNext();
 56:   }
 57:   cout<<endl<<endl;
 58: }
 
上面的函数中使用的知识在接下来的篇章中将进行讨论,现在只要需要知道他们的功能就行了。

步骤4:获取连接字符串

    在使用Connection对象之前我们先来看哈如何快速的获取连接字符串。

    1.在桌面上建立一个扩展名为udl的文件,如图:

udl

    2.双击打开,根据向导步骤操作。

connectString1connectString2connectString3

    3.用记事本打开此文件

connectString4

步骤5:使用Connection对象进行连接

  1: _ConnectionPtr connObject = NULL;
  2:   connObject.CreateInstance(__uuidof(Connection));  //创建一个实例
  3:   //连接字符串,就是我们在步骤4中获取的字符串
  4:   _bstr_t strConnStr = "Provider=SQLOLEDB.1;Password=zw123;\
  5:              Persist Security Info=True;User ID=sa;Initial Catalog=Communication;Data Source=DAVID-PC";
  6: 
  7:   TESTHR(connObject->Open(strConnStr, "", "", adConnectUnspecified));
  8:   _bstr_t strSql = "SELECT * FROM UserInfo";  
  9:   _RecordsetPtr table = connObject->Execute(strSql, NULL, adCmdText);
 10:   PrintTableHeader(table);
 11:   PrintTableRecords(table);

执行结果:

example1

到此,我们的第一个实例就完成了,像上面的Open和Excute函数是非常重要的,但是在此我们没有对他们的参数进行详细的说明,因为在下面的“附录A”中已经列出来了,需要查看相应函数的详细信息,你可以点击相应函数进入w3school.com.cn网站查看相应的参数。

实例工程下载地址:http://download.csdn.net/detail/zw514159799/6687767

posted @ 2013-12-09 22:34  骑乐在途11  阅读(2420)  评论(0编辑  收藏  举报