2013-04-23 47 views
7

phép nói rằng tôi có một bảng trong SQLServer tên MyTableCách lấy tên cột của bảng khi chạy trong C#?

ID FirstName LastName 
1 Harry  Dan 
2 Maria  Vicente 
3 Joe   Martin 

Bây giờ nếu tôi phải chèn thêm bất kỳ dữ liệu trong bảng, tôi sẽ chỉ đơn giản là bắn Insert Query như thế này

INSERT INTO MyTable (ID, FirstName, LastName) VALUES (4, Smith, Dan); 

Nhưng nếu tôi don không biết tên cột trước, tôi chỉ biết tên bảng. Sau đó, có một cách để có được tên cột của bảng tại thời gian chạy?

+2

Bạn đang chèn dữ liệu vào các bảng mà bạn không biết cấu trúc cho đến khi thời gian chạy? Âm thanh như một kịch bản xấu IMHO. – Jake1164

+0

@ Jake1164, điều này khá phổ biến đối với các hệ thống bị ngắt kết nối hoàn toàn. Hãy xem xét một ví dụ nơi bạn có một kho dữ liệu tập trung được sử dụng như một người hỗ trợ để chia sẻ dữ liệu giữa các dịch vụ phân tán theo địa lý mà bạn không biết gì về nó. Bây giờ hãy xem xét bạn có thể gửi một đối tượng, sử dụng các thuộc tính của nó và xây dựng một câu lệnh 'INSERT' cho một bảng mà bạn không biết gì cả - tất cả những gì bạn biết là các thuộc tính khớp với lược đồ và bảng được ** giả định ** ở đó . *** Trong ngắn hạn, tôi có thể nghĩ về nhiều tình huống mà bạn không biết về lược đồ *** –

+0

Ngoài tất cả các câu trả lời về truy vấn siêu dữ liệu hệ thống, nếu bạn thích giải pháp .NET thuần túy thì bạn có thể sử dụng một đối tượng [Bảng SMO '] (http://msdn.microsoft.com/en-us/library/ms220470.aspx) và kiểm tra bộ sưu tập' Cột '. – Pondlife

Trả lời

7

Bạn có thể sử dụng sql-

SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('TABLE_NAME') 
4

Hoặc bạn có thể truy vấn cho SELECT TOP 0 * FROM TableName. Sau đó, bạn có thể nhận được các cột:

using(var reader = command.ExecuteReader()) 
{ 
    reader.Read(); 
    var table = reader.GetSchemaTable(); 
    foreach (DataColumn column in table.Columns) 
    { 
     Console.WriteLine(column.ColumnName); 
    } 
} 
1

Đơn giản chỉ cần bằng cách truy vấn này:

SELECT * FROM sys.columns 
WHERE object_id = OBJECT_ID('dbo.[table_name]') 

HOẶC Query này:

SELECT COLUMN_NAME 
FROM information_schema.columns 
WHERE TABLE_NAME = [table_name] 
ORDER BY COLUMN_NAME 
3

Một tùy chọn sử dụng tinh khiết C#/code NET: Lần đầu tiên một phương pháp helper, mà ở đây trả về một danh sách đơn giản của tên cột. Sử dụng một DataTable để giữ thông tin lược đồ bảng, có nghĩa là các thông tin khác cũng có thể được truy xuất lại cho mỗi cột, fx. nếu nó là một cột AutoIncreament, vv

private IEnumerable<string> GetColumnNames(string conStr, string tableName) 
    { 
     var result = new List<string>(); 
     using (var sqlCon = new SqlConnection(conStr)) 
     { 
      sqlCon.Open(); 
      var sqlCmd = sqlCon.CreateCommand(); 
      sqlCmd.CommandText = "select * from " + tableName + " where 1=0"; // No data wanted, only schema 
      sqlCmd.CommandType = CommandType.Text; 

      var sqlDR = sqlCmd.ExecuteReader(); 
      var dataTable = sqlDR.GetSchemaTable(); 

      foreach (DataRow row in dataTable.Rows) result.Add(row.Field<string>("ColumnName")); 
     } 

     return result; 
    } 

Phương pháp này có thể được gọi là:

 var sortedNames = GetColumnNames("Data Source=localhost;Initial Catalog=OF2E;Integrated Security=SSPI", "Articles").OrderBy(x => x); 
     foreach (var columnName in sortedNames) Console.WriteLine(columnName); 
+0

Có vẻ như mọi người có một thời gian khó nhận thấy, đó là câu hỏi cho một giải pháp C# và không phải là câu trả lời SQL (mặc dù, nó là một chút khó hiểu, như câu hỏi bao gồm một số mã SQL) :) :) –

Các vấn đề liên quan