2012-08-28 26 views
8

Có thể sử dụng GetSchemaTable() để chỉ lấy tên cột không?Sử dụng GetSchemaTable() để chỉ lấy tên cột

Tôi đã cố truy xuất các tên cột (chỉ) bằng phương pháp này, có thể không.

DataTable table = myReader.GetSchemaTable(); 

    foreach (DataRow myField in table.Rows) 
    { 
     foreach (DataColumn myProperty in table.Columns) 
     { 
      fileconnectiongrid.Rows.Add(myProperty.ColumnName + " = " 
          + myField[myProperty].ToString()); 
     } 
    } 

Mã này lấy rất nhiều dữ liệu bảng không mong muốn, tôi chỉ cần một danh sách có chứa tên cột !:

Trả lời

17

Bạn cần phải sử dụng ExecuteReader(CommandBehavior.SchemaOnly)):

DataTable schema = null; 
using (var con = new SqlConnection(connection)) 
{ 
    using (var schemaCommand = new SqlCommand("SELECT * FROM table", con)) 
    { 
     con.Open(); 
     using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly)) 
     { 
      schema = reader.GetSchemaTable(); 
     } 
    } 
} 

SchemaOnly:

Truy vấn chỉ trả lại thông tin cột. Khi sử dụng SchemaOnly, Nhà cung cấp Dữ liệu Khuôn khổ .NET cho SQL Server đứng trước tuyên bố đang được thực thi bằng SET FMTONLY ON.

Tên cột nằm trong cột đầu tiên của mỗi hàng. Tôi không nghĩ rằng có thể bỏ qua các thông tin cột khác như ColumnOrdinal,ColumnSize,NumericPrecision và cứ tiếp tục kể từ khi bạn không thể sử dụng reader.GetString nhưng chỉ có reader.GetSchemaTable trong trường hợp này.

Nhưng vòng lặp của bạn là không chính xác nếu bạn chỉ muốn các tên cột:

foreach (DataRow col in schema.Rows) 
{ 
    Console.WriteLine("ColumnName={0}", col.Field<String>("ColumnName")); 
} 
+0

Tuy nhiên trả về tất cả dữ liệu :-(có lẽ cái gì sai với vòng lặp của tôi – user1495962

+0

@ user1495962:.. Cái tên cột là trong cột đầu tiên của mỗi hàng Tôi không nghĩ rằng nó có thể bỏ qua các thông tin cột khác như 'ColumnOrdinal, ColumnSize, NumericPrecision', v.v. ** Đã chỉnh sửa câu trả lời của tôi ** –

+0

Tác vụ này thx! – user1495962

0

Thay đổi mã của bạn xuống dưới nếu tất cả các bạn muốn là để hiển thị các tên cột. Mã ban đầu của bạn đang cố gắng không chỉ hiển thị tên cột mà còn cố gắng hiển thị các giá trị dữ liệu thực tế.

DataTable table = myReader.GetSchemaTable(); 

foreach (DataRow myField in table.Rows) 
{ 
    foreach (DataColumn myProperty in table.Columns) 
    { 
     fileconnectiongrid.Rows.Add(myProperty.ToString()); 
    } 
} 
+0

tr yid thiết lập nó không có may mắn – user1495962

0

này sẽ cung cấp cho bạn tất cả các tên cột, bạn có thể đặt chúng trong một string[] và làm với họ những gì bạn muốn.

foreach(var columnName in DataTable.Columns) 
{ 
    Console.WriteLine(columnName); 
} 
0
//Retrieve column schema into a DataTable. 
schemaTable = reader.GetSchemaTable(); 

int index = schemaTable.Columns.IndexOf("ColumnName"); 
DataColumn columnName = schemaTable.Columns[index]; 

//For each field in the table... 
foreach (DataRow myField in schemaTable.Rows) 
    { 
    String columnNameValue = myField[columnName].ToString(); 
    Console.WriteLine("ColumnName " + columnNameValue); 
    } 
Các vấn đề liên quan