2013-04-23 5 views
7

Допустим, у меня есть таблица в SQLServer с именем MyTableКак получить имена столбцов таблицы во время выполнения на C#?

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

Теперь, если я должен вставить все данные в таблице, я просто огонь Вставить запрос как этот

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

Но что, если я не Не знаю имена столбцов заранее, я знаю только имя таблицы. Тогда есть способ получить имя столбца таблицы во время выполнения?

+2

Вы вставляете данные в таблицы, которые вы не знаете структуру до выполнения? Похоже на плохой сценарий ИМХО. – Jake1164

+0

@ Jake1164, это довольно распространено для полностью отключенных систем. Рассмотрим пример, когда у вас есть централизованное хранилище данных, которое используется в качестве посредника для обмена данными между географически распределенными службами, о которых вы ничего не знаете. Теперь подумайте, что вы можете отправить объект, использовать его свойства и построить инструкцию 'INSERT' для таблицы, о которой вы ничего не знаете, - все, что вы знаете, это то, что свойства соответствуют схеме и что таблица ** предполагается **, чтобы быть там , *** Короче говоря, я могу придумать больше сценариев, в которых вы не знали бы о схеме. *** –

+0

В дополнение ко всем ответам о запросе системных метаданных, если вы предпочитаете «чистое» .NET-решение, тогда вы можете используйте объект [SMO 'Table'] (http://msdn.microsoft.com/en-us/library/ms220470.aspx) и изучите коллекцию« Columns ». – Pondlife

ответ

7

Вы можете использовать sql-

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

Или вы можете запросить SELECT TOP 0 * FROM TableName. Затем, вы можете получить столбцы:

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

Просто запрос:

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

ИЛИ запрос:

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

Другой вариант с использованием чистого C#/.NET код: Первый вспомогательный метод, который здесь возвращает простой список имен столбцов. Использование DataTable для хранения данных схемы схемы означает, что другая информация также может быть восстановлена ​​для каждого столбца, fx. если это AutoIncreament колонна и т.д.

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

Метод можно назвать:

 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#, а не SQL-ответ (хотя, это немного запутанно, так как вопрос включает в себя некоторый код SQL) :) :) –

Смежные вопросы