Использование SqlDataReader.GetColumnSchema () невозможно - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь использовать метод GetColumnSchema класса SqlDataReader.Но 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();
    }
}

}

1 Ответ

0 голосов
/ 05 апреля 2019

SqlDataReader имеет свойство GetName(), которое принимает индекс и возвращает имя столбца.

GetName () поддерживается в большинстве версий .Net Framework (начиная с версии 1.1) и .Net core (начиная с версии 1.0).

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);
...