首页 > 解决方案 > 无法使用 SqlDataReader.GetColumnSchema()

问题描述

我正在尝试使用 SqlDataReader 类的 GetColumnSchema 方法。但是 VS 告诉我 SqlDataReader 不包含 GetColumnSchema 的定义。我错过了命名空间或程序集引用吗?

我的项目正在使用 .NET Framework 4.6.1

using System;
using DocuWare.LoggingNew;
using System.Data.SqlClient;
using System.Data;
using System.Xml.Linq;
using System.Linq;
using System.IO;

private void WriteSQLQueryOutputToTextFile(string DBUser, string DBUserPassword, string sqlQuery, string databaseName, string nameOfOutputFile)
{
  StreamWriter outputFile = new StreamWriter(dWTestResult + "\\DatabaseUpgradeCheck\\" + nameOfOutputFile);           

  using (SqlConnection sqlCon = new SqlConnection("Data Source=" + GetEnvironmentVariable.MachineName + "; Initial Catalog=" + databaseName + "; User ID=" + DBUser + "; Password=" + DBUserPassword + ";"))
    {
      SqlCommand command = new SqlCommand(sqlQuery, sqlCon);
      sqlCon.Open();
      SqlDataReader reader = command.ExecuteReader();
    try
    {   
        while (reader.Read())
        {
            var columnSchema = reader.GetColumnSchema();
            string header = string.Empty;

            for (int i = 0; i < reader.FieldCount; i++)
            {
                header += $", {columnSchema[i].ColumnName}";
            }
        }
    }
    catch (Exception ex)
    {
        logger.Debug(ex, "Writing Database Output to the " + nameOfOutputFile + " file failed");
    }
    finally
    {
        reader.Close();
        outputFile.Close();
        sqlCon.Close();
    }
}

}

标签: c#databasesqldatareader

解决方案


SqlDataReader有一个属性GetName(),它接受一个索引并返回列名。

大多数 .Net 框架(从 v1.1 开始)和 .Net 核心(从 v1.0 开始)版本都支持GetName() 。

while (reader.Read())
{
    string header = string.Empty;

    for (int i = 0; i < reader.FieldCount; i++)
    {
        header += $", {reader.GetName(i)}";
    }
}

或者你可以使用方法链和 Linq 来做到这一点:

// returns List<string>
var columns = Enumerable.Range(0, reader.FieldCount)
                        .Select(reader.GetName)
                        .ToList();

// columns joined on ", "
var header = string.Join(", ", columns);

推荐阅读