你目前正处于脱机状态,正在等待 Internet 重新连接

HOW TO:使用 Visual C++ .NET 从数据库填充数据集对象

有关本文的 Microsoft Visual Basic .NET 版本,请参阅 301216.
有关本文的 Microsoft Visual C# .NET 版本,请参阅 314145
本文引用下面的 Microsoft .NET Framework 类库命名空间:

System.Data.SqlClient

本任务的内容

概要
本文分步介绍了如何使用一个或多个数据库查询结果来填充数据集对象,并介绍了在数据集对象中加载查询结果后如何访问数据。数据集对象是内存中的对象,能够保存对 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 命名空间中的各种对象,您可以连接到数据库服务器,运行查询,然后将结果放置到一个数据集对象中。该数据集是一个断开了连接的对象。因此,加载数据后,在您要加载更多数据或者要使用您对这些信息的内存副本所作的更改来更新服务器之前,不会再使用与数据库的连接。

若要将数据从数据库加载到数据集中,请按照下列步骤操作:
  1. 启动 Visual Studio .NET。
  2. 在 Visual C++ .NET 2002 中创建一个新的托管 C++ 应用程序,或者在 Visual C++ .NET 2003 中创建一个新的控制台应用程序。将项目命名为 MyApplication,然后单击“确定”。
  3. 将下面的代码添加到“MyApplication.cpp”文件中。

    这将添加一个对 System.Dll 命名空间、System.Xml 命名空间和 System.Data 命名空间的引用。
    #using <System.Dll>#using <System.Data.Dll>#using <System.Xml.Dll>
  4. 对 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;
  5. 将数据从数据库移到数据集。

    为此,您必须建立一个数据库连接。这需要一个 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();
  6. 创建一个 DataAdapter 对象,用它表示数据库和数据集对象之间的链接。您可以将 SQL Server 或另一类型的用于检索数据的命令指定为 DataAdapter 的构造函数对象的一部分。下面的示例使用了一个 SQL 语句从 Pubs 数据库的 Authors 表检索记录。
    SqlDataAdapter* daAuthors = new SqlDataAdapter("Select * From Authors", objConn);
  7. 声明并创建一个数据集对象实例。

    在此过程中,您必须先为整个数据集提供一个名称,然后再开始加载数据。该名称可包含若干独立的表。
    DataSet* dsPubs = new DataSet("Pubs");
  8. 在处理数据加载的过程中,请先运行 FillSchema,然后运行 Fill

    SqlDataAdapter 类提供 FillFillSchema 两种方法,这对于加载这些数据很关键。这两种方法都将信息加载到了一个数据集内。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 集合中一个数据表对象。如果您在对 FillSchemaFill 的调用中指定了一个表名,则可以使用该名称访问您需要的特定表。
    DataTable* tblAuthors = dsPubs->Tables->Item["Authors"];
  9. 使用 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"))); }
  10. 保存项目。在“调试”菜单上,单击“启动”以运行该项目。

返回页首

完整代码列表

// 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;}

返回页首
属性

文章 ID:818779 - 上次审阅时间:05/16/2007 03:29:00 - 修订版本: 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
反馈