Help and Support

文章编号: 310107 - 最后修改: 2002年6月18日 - 修订: 1.0

HOW TO:使用 DataReader GetSchemaTable 方法和 Visual C# .NET 检索列架构

本文的发布号曾为 CHS310107

本页

展开全部 | 关闭全部

概要

本文演示如何用 ADO.NET 中 DataReader 对象的 GetSchemaTable 方法检索列架构信息。列架构的另一名称是列的字段属性。列架构信息包括关于列的以下信息:
  • 名称
  • 数据类型
  • 大小
  • 该列是否为主键字段
  • 该列是否为自动编号(自动增加)字段
GetSchemaTable 方法返回一个包含 DataReader 的列架构的 DataTable 属性。DataTable 中的各行分别对应于结果集的各个字段。各个列分别映射结果集中字段的一个属性。DataTable 列的 ColumnName 属性是字段的属性(如 ColumnNameDataTypeColumnSizeIsKeyColumnIsAutoIncrement 属性)的名称。DataTable 列的值是字段的属性的值,如 ColumnName 属性的 FirstName 值。

您可以将 GetSchemaTable 方法用于 OLE DB .NET 提供程序或 SQL .NET 提供程序。OleDbDataReader.GetSchemaTable 方法映射到 OLE DB IColumnsRowset::GetColumnsRowset 方法。SqlDataReader.GetSchemaTable 方法不使用"OLE DB 提供程序"层。

须注意的是,除非明确地使用 GetSchemaTable 方法,否则 DataReader 将不返回列架构。另外,如果使用 GetSchemaTable 检索列架构,您将无法更新 DataReaderDataReader 总是从数据库中检索只读、只向前的数据流。

何时使用 GetSchemaTable 方法

  • SqlConnection 对象不支持使用与 OleDbConnection 对象的 GetOleDbSchemaTable 方法类似的方法检索 SQL Server 架构信息。SqlDataReader 类的 GetSchemaTable 方法为从 SQL Server 中获取列架构信息提供了一种更直截了当的方式。
  • 尽管 OleDbConnection 对象的 GetOleDbSchemaTable 方法能返回数据库、表和列架构信息,但是,如果只想检索列架构信息,您会发现,DataReader 对象的 GetSchemaTable 方法更容易使用。
  • 在自定义列名称和其他列属性时,可以使用 GetSchemaTable 方法基于一个现有 DataTable 属性的架构来创建一个新的 DataTable。有关演示如何使用 GetSchemaTable 来定义新表的示例代码,请参见"Visual Studio 示例:Fitch and Mather 7.0 运行 SQL 查询"这一主题,它包括在 Microsoft Visual Studio .NET 联机帮助文档中。

使用 OLE DB .NET 提供程序检索列架构

本示例列出了 SQL Server Northwind 数据库中的 Employees 表的列(字段属性)的架构信息。

注意,当您使用 OLE DB .NET 提供程序时,会用到 OleDbDataReader 对象的 GetSchemaTable 方法。
  1. 启动 Visual Studio .NET,然后新建一个 Visual C# 控制台应用程序项目。默认情况下,Class1.cs 被创建。
  2. 打开 Class1 的代码窗口。将下面的代码粘贴到代码窗口的顶部,位于 namespace 声明之上:
    using System.Data;
    using System.Data.OleDb;
  3. 在代码窗口中,将下面的代码粘贴到 Main 函数中:
    OleDbConnection cn = new OleDbConnection();
    OleDbCommand cmd = new OleDbCommand();
    DataTable schemaTable; 
    OleDbDataReader myReader; 
    			 
    //Open a connection to the SQL Server Northwind database.
    cn.ConnectionString = "Provider=SQLOLEDB;Data Source=server;User ID=login;
    Password=password;Initial Catalog=Northwind";
    cn.Open();
    
    //Retrieve records from the Employees table into a DataReader.
    cmd.Connection = cn;
    cmd.CommandText = "SELECT * FROM Employees";
    myReader = cmd.ExecuteReader();
    
    //Retrieve column schema into a DataTable.
    schemaTable = myReader.GetSchemaTable();
    
    //For each field in the table...
    foreach (DataRow myField in schemaTable.Rows){
    //For each property of the field...
    foreach (DataColumn myProperty in schemaTable.Columns) {
    	//Display the field name and value.
    	Console.WriteLine(myProperty.ColumnName + " = " + myField[myProperty].ToString());
        }
    Console.WriteLine();
    
    //Pause.
    Console.ReadLine();
    }
    
    //Always close the DataReader and connection.
    myReader.Close();
    cn.Close();
  4. 修改 ConnectionString 属性的参数,以便正确地连接到您的 SQL Server 计算机。
  5. 按 F5 键编译并运行该项目。您会注意到各字段的属性列在了控制台窗口中。
  6. 按 ENTER 键滚动查看该列表,结束控制台应用程序,并返回到集成开发环境 (IDE)。

使用 SQL .NET 提供程序检索列架构

本示例列出了 SQL Server Northwind 数据库中的 Employees 表的列(字段属性)的架构信息。

注意,当您使用 SQL .NET 提供程序时,会用到 SqlDataReader 对象的 GetSchemaTable 方法。
  1. 启动 Visual Studio .NET 并新建一个 Visual C# 控制台应用程序。默认情况下,Class1.cs 被创建。
  2. 打开 Class1 的代码窗口。将下面的代码粘贴到代码窗口的顶部,位于 namespace 声明之上:
    using System.Data;
    using System.Data.SqlClient;
  3. 在代码窗口中,将下面的代码粘贴到 Main 函数中:
    SqlConnection cn = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    DataTable schemaTable; 
    SqlDataReader myReader ;
    			 
    //Open a connection to the SQL Server Northwind database.
    cn.ConnectionString = "Data Source=server;User ID=login;
    Password=password;Initial Catalog=Northwind";
    cn.Open();
    
    //Retrieve records from the Employees table into a DataReader.
    cmd.Connection = cn;
    cmd.CommandText = "SELECT * FROM Employees";
    myReader = cmd.ExecuteReader();
    
    //Retrieve column schema into a DataTable.
    schemaTable = myReader.GetSchemaTable();
    
    //For each field in the table...
    foreach (DataRow myField in schemaTable.Rows){
    //For each property of the field...
    foreach (DataColumn myProperty in schemaTable.Columns) {
    	//Display the field name and value.
    	Console.WriteLine(myProperty.ColumnName + " = " + myField[myProperty].ToString());
        }
    Console.WriteLine();
    
    //Pause.
    Console.ReadLine();
    }
    
    //Always close the DataReader and connection.
    myReader.Close();
    cn.Close();
  4. 修改 ConnectionString 属性的参数,以便正确地连接到您的 SQL Server 计算机。
  5. 按 F5 键编译并运行该项目。您会注意到各字段的属性列在了控制台窗口中。
  6. 按 ENTER 键滚动查看该列表,结束控制台应用程序,并返回到 IDE。

参考

有关 DataReaderGetSchemaTable 方法的更多信息,请参见 Visual Studio .NET 联机帮助文档的以下主题:
使用 DataReader 检索数据
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp)

IDataReader.GetSchemaTable Method
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataIDataReaderClassGetSchemaTableTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataIDataReaderClassGetSchemaTableTopic.asp)

备注:本主题包含返回的数据表中所有列的完整列表。

OleDbDataReader.GetSchemaTable 方法
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataOleDbOleDbDataReaderClassGetSchemaTableTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataOleDbOleDbDataReaderClassGetSchemaTableTopic.asp)

SqlDataReader.GetSchemaTable 方法
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlDataReaderClassGetSchemaTableTopic.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemDataSqlClientSqlDataReaderClassGetSchemaTableTopic.asp)
有关使用 OleDbConnection 对象的 GetOleDbSchemaTable 方法检索架构信息的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中的文章:
309681? (http://support.microsoft.com/kb/309681/ZH-CN/ ) HOW TO:使用 GetOleDbSchemaTable 和 Visual C# .NET 检索架构信息

这篇文章中的信息适用于:
  • Microsoft ADO.NET(随 .NET 框架一起提供)
  • Microsoft Visual C# .NET 2002 标准版
关键字:?
kbhowto kbhowtomaster kbsqlclient kbsystemdata kbdatabase kboledb KB310107
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

文章翻译