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的文件,如图:
2.双击打开,根据向导步骤操作。
3.用记事本打开此文件
步骤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);
执行结果:
到此,我们的第一个实例就完成了,像上面的Open和Excute函数是非常重要的,但是在此我们没有对他们的参数进行详细的说明,因为在下面的“附录A”中已经列出来了,需要查看相应函数的详细信息,你可以点击相应函数进入w3school.com.cn网站查看相应的参数。
实例工程下载地址:http://download.csdn.net/detail/zw514159799/6687767