2009-03-25 31 views

Trả lời

336
var reader = cmd.ExecuteReader(); 

var columns = new List<string>(); 

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

hoặc

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

Thật điên rồ khi không có giao diện đếm được cho phép bạn lặp qua các cột. – JohnFx

+48

Ngắn hơn một chút: 'cột = Enumerable.Range (0, reader.FieldCount) \t \t .Chọn (reader.GetName) .ToList();' – Alex

+2

Công trình này tuyệt vời.Tôi cũng phát hiện ra rằng tên cột của tôi là tất cả các chữ hoa, trừ khi tôi sử dụng dấu ngoặc kép xung quanh tên cột. 'SELECT id AS" MyId "FROM table;' – styfle

69

Có chức năng GetName trên SqlDataReader chấp nhận chỉ mục cột và trả về tên của cột.

Ngược lại, có một GetOrdinal có tên cột và trả về chỉ mục cột.

+5

Tại sao trên trái đất không này đánh dấu là câu trả lời? –

+3

Hai lý do: đầu tiên, áp phích ban đầu chưa chọn câu trả lời và thứ hai, có các câu trả lời khác cung cấp mô tả chi tiết hơn về 'giải pháp' của vấn đề sau đó chỉ là sự tồn tại của chức năng. Cá nhân, tôi thích câu trả lời của Steven Lyons là tốt nhất vì nó không chỉ nói về GetName mà còn đi vào FieldType và DataType. –

+0

'GetOrdinal' là hoàn hảo. Tôi đã tìm kiếm 'GetName', nhưng giải pháp sạch hơn cho vấn đề của tôi với' GetOrdinal'. – goodeye

33

Bạn có thể lấy tên cột từ DataReader.

Đây là phần quan trọng:

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 
    } 
+1

Liên kết đã chết. – shuttle87

3

Bạn chắc chắn có thể.


protected void GetColumNames_DataReader() 
{ 
    System.Data.SqlClient.SqlConnection SqlCon = new System.Data.SqlClient.SqlConnection("server=localhost;database=northwind;trusted_connection=true"); 
    System.Data.SqlClient.SqlCommand SqlCmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM Products", SqlCon); 

    SqlCon.Open(); 

    System.Data.SqlClient.SqlDataReader SqlReader = SqlCmd.ExecuteReader(); 
    System.Int32 _columncount = SqlReader.FieldCount; 

    System.Web.HttpContext.Current.Response.Write("SqlDataReader Columns"); 
    System.Web.HttpContext.Current.Response.Write(" "); 

    for (System.Int32 iCol = 0; iCol < _columncount; iCol ++) 
    { 
    System.Web.HttpContext.Current.Response.Write("Column " + iCol.ToString() + ": "); 
    System.Web.HttpContext.Current.Response.Write(SqlReader.GetName(iCol).ToString()); 
    System.Web.HttpContext.Current.Response.Write(" "); 
    } 

} 

Đây là có nguồn gốc từ: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik

2

tôi sử dụng phương pháp GetSchemaTable, được tiếp xúc thông qua giao diện IDataReader.

+0

có đây là một bài viết về nó: Lấy thông tin lược đồ từ bộ dữ liệu https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx –

6

Nếu bạn muốn chỉ các tên cột, bạn có thể làm:

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")); 
    } 
} 

Nhưng nếu bạn chỉ cần một dòng, tôi thích Ngoài AdoHelper tôi. Bổ sung này là rất tốt nếu bạn có một truy vấn một dòng và bạn không muốn đối phó với bảng dữ liệu trong mã của bạn. Nó trả về một từ điển không phân biệt dạng chữ của các tên cột và các giá trị.

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; 
} 
+1

'throw ex;' là thực tiễn tồi tệ nhất. – asawyer

+1

chỉ là một ví dụ –

+1

Asawyer, ít nhất bạn cũng nên nói tại sao. Tôi cho rằng bạn sẽ nói rằng bạn nên sử dụng "ném"; thay vào đó để bạn không bị mất chi tiết dấu vết gốc. –

12

Đã được đề cập. Chỉ cần một câu trả lời là 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(); 

Cách thứ hai sạch hơn và nhanh hơn nhiều. Ngay cả khi bạn cache GetSchemaTable trong phương pháp đầu tiên, truy vấn sẽ rất chậm.

+0

Có cách nào để thực hiện điều này với Giá trị không? –

+0

@TravisHeeter Tôi không hiểu bạn. Tìm tên cột từ các giá trị của cái gì? – nawfal

+0

Tôi có nghĩa là chỉ là một cách phía đông để có được các giá trị trong tập kết quả vào một danh sách, hoặc có lẽ là toàn bộ một đối tượng IEnumerable . –

3

Sử dụng một phương pháp khuyến nông:

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

Nó là dễ dàng hơn để đạt được điều đó trong SQL

var columnsList = dbContext.Database.SqlQuery<string>("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'SCHEMA_OF_YOUE_TABLE' AND TABLE_NAME = 'YOUR_TABLE_NAME'").ToList(); 
Các vấn đề liên quan