[C#] SqlDataReader에서 열 이름을 얻을 수 있습니까?

데이터베이스에 연결 한 후 내에서 반환 된 모든 열의 이름을 얻을 수 SqlDataReader있습니까?



답변

var reader = cmd.ExecuteReader();

var columns = new List<string>();

for(int i=0;i<reader.FieldCount;i++)
{
   columns.Add(reader.GetName(i));
}

또는

var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();


답변

GetName기능이 있습니다SqlDataReader 열 인덱스를 허용하고 열 이름을 반환 .

반대로 GetOrdinal열 이름을 가져와 열 인덱스를 반환하는가 있습니다.


답변

DataReader에서 열 이름을 가져올 수 있습니다.

중요한 부분은 다음과 같습니다.

  for (int col = 0; col < SqlReader.FieldCount; col++)
  {
    Console.Write(SqlReader.GetName(col).ToString());         // Gets the column name
    Console.Write(SqlReader.GetFieldType(col).ToString());    // Gets the column type
    Console.Write(SqlReader.GetDataTypeName(col).ToString()); // Gets the column database type
  }


답변

이미 언급했습니다. 그냥 LINQ의 대답 :

var columns = reader.GetSchemaTable().Rows
                                     .Cast<DataRow>()
                                     .Select(r => (string)r["ColumnName"])
                                     .ToList();

//Or

var columns = Enumerable.Range(0, reader.FieldCount)
                        .Select(reader.GetName)
                        .ToList();

두 번째는 더 깨끗하고 훨씬 빠릅니다. GetSchemaTable첫 번째 접근 방식으로 캐시하더라도 쿼리 속도가 매우 느려집니다.


답변

열 이름 만 원하는 경우 다음을 수행 할 수 있습니다.

List<string> columns = new List<string>();
using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly))
{
    DataTable dt = reader.GetSchemaTable();
    foreach (DataRow row in dt.Rows)
    {
        columns.Add(row.Field<String>("ColumnName"));
    }
}

그러나 한 행만 필요하면 AdoHelper 추가 기능이 좋습니다. 이 추가는 단일 행 쿼리가 있고 코드에서 데이터 테이블을 처리하지 않으려는 경우에 좋습니다. 열 이름과 값의 대소 문자를 구분하지 않는 사전을 반환합니다.

public static Dictionary<string, string> ExecuteCaseInsensitiveDictionary(string query, string connectionString, Dictionary<string, string> queryParams = null)
{
    Dictionary<string, string> CaseInsensitiveDictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
    try
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            conn.Open();
            using (SqlCommand cmd = new SqlCommand())
            {
                cmd.Connection = conn;
                cmd.CommandType = CommandType.Text;
                cmd.CommandText = query;

                // Add the parameters for the SelectCommand.
                if (queryParams != null)
                    foreach (var param in queryParams)
                        cmd.Parameters.AddWithValue(param.Key, param.Value);

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    DataTable dt = new DataTable();
                    dt.Load(reader);
                    foreach (DataRow row in dt.Rows)
                    {
                        foreach (DataColumn column in dt.Columns)
                        {
                            CaseInsensitiveDictionary.Add(column.ColumnName, row[column].ToString());
                        }
                    }
                }
            }
            conn.Close();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return CaseInsensitiveDictionary;
}


답변

IDataReader 인터페이스를 통해 노출되는 GetSchemaTable 메서드를 사용합니다 .


답변

확장 방법을 사용하십시오.

    public static List<string> ColumnList(this IDataReader dataReader)
    {
        var columns = new List<string>();
        for (int i = 0; i < dataReader.FieldCount; i++)
        {
            columns.Add(dataReader.GetName(i));
        }
        return columns;
    }