本文分步介绍了如何使用一个或多个数据库查询结果来填充数据集对象,并介绍了在数据集对象中加载查询结果后如何访问数据。数据集对象是内存中的对象,能够保存对
Microsoft .NET Framework 的数据访问起重要作用的一些表、视图和关系。
要求
下表列出了推荐使用的硬件、软件、网络基础结构以及您必须拥有的 Service Pack:
- Microsoft Windows 2000 Professional、Microsoft Windows 2000
Server、Microsoft Windows 2000 Advanced Server 或 Microsoft Windows NT 4.0
Server
- Microsoft SQL Server 7.0、Microsoft SQL Server 2000 或安装了
Pubs 示例数据库的 Microsoft 数据引擎
- Microsoft Visual Studio .NET
本文假定您熟悉下列主题:
- 数据库术语
- Microsoft SQL Server
填充数据集
通过使用 System.Data
命名空间中的各种对象,您可以连接到数据库服务器,运行查询,然后将结果放置到一个数据集对象中。该数据集是一个断开了连接的对象。因此,加载数据后,在您要加载更多数据或者要使用您对这些信息的内存副本所作的更改来更新服务器之前,不会再使用与数据库的连接。
若要将数据从数据库加载到数据集中,请按照下列步骤操作:
- 启动 Visual Studio .NET。
- 在 Visual C++ .NET 2002 中创建一个新的托管 C++ 应用程序,或者在 Visual C++
.NET 2003 中创建一个新的控制台应用程序。将项目命名为
MyApplication,然后单击“确定”。
- 将下面的代码添加到“MyApplication.cpp”文件中。
这将添加一个对
System.Dll 命名空间、System.Xml 命名空间和 System.Data 命名空间的引用。
#using <System.Dll>
#using <System.Data.Dll>
#using <System.Xml.Dll>
- 对 System 命名空间、System.Data 命名空间、System.Xml
命名空间、System.Collections 命名空间和 System.Data.SqlClient 命名空间使用 USING 语句,这样以后在您的代码中就不必限定这些命名空间中的声明了。 这些语句必须位于任何其他声明之前。
using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace System::Collections;
using namespace System::Data::SqlClient;
- 将数据从数据库移到数据集。
为此,您必须建立一个数据库连接。这需要一个
System.Data.SqlClient.SqlCommand
对象和一个连接字符串。这些代码中的连接字符串用于连接一台运行着位于本地计算机(运行这些代码的计算机)上的 SQL Server
的计算机。您必须根据您的环境相应地修改该连接字符串。创建 SqlConnection 对象后,请调用该对象的 Open 方法以建立实际的数据库链接。SqlConnection* objConn;
String* sConnectionString;
sConnectionString = "Password=myPassword;User ID=myUserID;Initial Catalog=pubs;Data Source=(local)";
objConn = new SqlConnection(sConnectionString);
objConn->Open();
- 创建一个 DataAdapter 对象,用它表示数据库和数据集对象之间的链接。您可以将 SQL Server
或另一类型的用于检索数据的命令指定为 DataAdapter 的构造函数对象的一部分。下面的示例使用了一个 SQL 语句从 Pubs 数据库的 Authors
表检索记录。
SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);
- 声明并创建一个数据集对象实例。
在此过程中,您必须先为整个数据集提供一个名称,然后再开始加载数据。该名称可包含若干独立的表。
DataSet* dsPubs = new DataSet("Pubs"); - 在处理数据加载的过程中,请先运行 FillSchema,然后运行 Fill。
SqlDataAdapter 类提供 Fill 和 FillSchema 两种方法,这对于加载这些数据很关键。这两种方法都将信息加载到了一个数据集内。Fill 方法加载数据本身,而 FillSchema 方法加载有关特定表的所有可用的元数据(例如列名、主键和约束)。
daAuthors->FillSchema(dsPubs,SchemaType::Source, "Authors");
daAuthors->Fill(dsPubs,"Authors");
如果您只使用 Fill,则只能加载用于描述列名和数据类型的基本元数据。Fill 方法不加载主键信息。要改变此默认行为,您可以将 DataAdapter 对象的 MissingSchemaAction 属性设置为 MissingSchemaAction.AddWithKey。这样,除了加载默认信息外,还将加载主键元数据。
daAuthors->MissingSchemaAction = MissingSchemaAction::AddWithKey;
daAuthors->Fill(dsPubs,"Authors");
这些数据现在用作数据集的 Tables 集合中一个数据表对象。如果您在对 FillSchema 和 Fill 的调用中指定了一个表名,则可以使用该名称访问您需要的特定表。
DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];
- 使用 GetEnumerator 函数访问数据表的 Rows 集合中的 DataRow 对象。使用 While
循环来重复表中的每一行。您可以按名称或按位置索引来访问列。零 (0) 是第一个列位置。
IEnumerator* iEnum = tblAuthors->Rows->GetEnumerator();
while(iEnum->MoveNext())
{
Console::WriteLine("{0} {1}",dynamic_cast<String*>(dynamic_cast<DataRow *>(iEnum->Current)->get_Item("au_fname")),
dynamic_cast<String*>(dynamic_cast<DataRow *>(iEnum->Current)->get_Item("au_lname")));
}
- 保存项目。在“调试”菜单上,单击“启动”以运行该项目。
完整代码列表
// This is the main project file for the VC++ application project
// that is generated by using the Application wizard.
#include "stdafx.h"
#using <mscorlib.dll>
#include <tchar.h>
#using <System.Dll>
#using <System.Data.Dll>
#using <System.Xml.Dll>
using namespace System;
using namespace System::Data;
using namespace System::Xml;
using namespace System::Collections;
using namespace System::Data::SqlClient;
// This is the entry point for this application.
int _tmain(void)
{
SqlConnection* objConn;
try
{
String* sConnectionString;
sConnectionString = "Password=myPassword;User ID=myUserID;Initial Catalog=pubs;Data Source=(local)";
objConn = new SqlConnection(sConnectionString);
objConn->Open();
SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);
DataSet* dsPubs = new DataSet("Pubs");
daAuthors->FillSchema(dsPubs,SchemaType::Source, "Authors");
daAuthors->Fill(dsPubs,"Authors");
DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];
IEnumerator* iEnum = tblAuthors->Rows->GetEnumerator();
while(iEnum->MoveNext())
{
Console::WriteLine("{0} {1}",dynamic_cast<String*>(dynamic_cast<DataRow *>(iEnum->Current)->get_Item("au_fname")),
dynamic_cast<String*>(dynamic_cast<DataRow *>(iEnum->Current)->get_Item("au_lname")));
}
}
catch(Exception *ex)
{
Console::WriteLine( ex->Message );
}
__finally
{
objConn->Close();
}
return 0;
}有关更多信息,请访问下面的 Microsoft Web 站点:
http://msdn2.microsoft.com/en-us/library/ms810293.aspx
(http://msdn2.microsoft.com/en-us/library/ms810293.aspx)
http://msdn2.microsoft.com/en-us/library/ms973217.aspx
(http://msdn2.microsoft.com/en-us/library/ms973217.aspx)
http://msdn.microsoft.com/net
(http://msdn.microsoft.com/net)
文章编号: 818779 - 最后修改: 2007年5月16日 - 修订: 2.2
这篇文章中的信息适用于:
- Microsoft Visual C++ .NET 2002 标准版
- Microsoft Visual C++ .NET 2003 Standard Edition
- Microsoft ADO.NET 1.0
- Microsoft ADO.NET 1.1
| kbhowto kbhowtomaster kbsqlclient kbsystemdata KB818779 |
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。