2013-10-15 7 views
6

Я пытаюсь получить имена столбцов таблицы, которую я сохранил в SQL Server 2008 R2.Получить имя столбца из SQL Server

Я буквально пробовал все, но я не могу найти, как это сделать.

Сейчас это мой код в C#

public string[] getColumnsName() 
{ 
     List<string> listacolumnas=new List<string>(); 

     using (SqlConnection connection = new SqlConnection(Connection)) 
     using (SqlCommand command = connection.CreateCommand()) 
     { 
      command.CommandText = "SELECT TOP 0 * FROM Usuarios"; 
      connection.Open(); 

      using (var reader = command.ExecuteReader(CommandBehavior.KeyInfo)) 
      { 
       reader.Read(); 

       var table = reader.GetSchemaTable(); 

       foreach (DataColumn column in table.Columns) 
       { 
        listacolumnas.Add(column.ColumnName); 
       } 
      } 
     } 
     return listacolumnas.ToArray(); 
    } 

Но это возвращает меня следующие

<string>ColumnName</string> 
<string>ColumnOrdinal</string> 
<string>ColumnSize</string> 
<string>NumericPrecision</string> 
<string>NumericScale</string> 
<string>IsUnique</string> 
<string>IsKey</string> 
<string>BaseServerName</string> 
<string>BaseCatalogName</string> 
<string>BaseColumnName</string> 
<string>BaseSchemaName</string> 
<string>BaseTableName</string> 
<string>DataType</string> 
<string>AllowDBNull</string> 
<string>ProviderType</string> 
<string>IsAliased</string> 
<string>IsExpression</string> 
<string>IsIdentity</string> 
<string>IsAutoIncrement</string> 
<string>IsRowVersion</string> 
<string>IsHidden</string> 
<string>IsLong</string> 
<string>IsReadOnly</string> 
<string>ProviderSpecificDataType</string> 
<string>DataTypeName</string> 
<string>XmlSchemaCollectionDatabase</string> 
<string>XmlSchemaCollectionOwningSchema</string> 
<string>XmlSchemaCollectionName</string> 
<string>UdtAssemblyQualifiedName</string> 
<string>NonVersionedProviderType</string> 
<string>IsColumnSet</string> 

Есть идеи?

Он показывает теги <string>, так как мой веб-сервис отправляет данные.

+1

Вы должны перебрать * * строки в 'GetSchemaTable', в противном случае вы просто получаете столбцы метаданных. Это всего лишь вторая таблица, которая описывает первый. – Alejandro

+0

Это дубликат того, что кажется бесконечным количеством вопросов на SO и в Интернете, а также в документации MS. Вот хороший запрос, чтобы вы начали находить все существующие ответы. Я просто взял заголовок вашего вопроса и подключил его к Google: http://bit.ly/GXswgz –

ответ

17

Вы можете использовать запрос ниже, чтобы получить имена столбцов для таблицы. Запрос ниже получает все столбцы для таблицы пользователя данного имени:

select c.name from sys.columns c 
inner join sys.tables t 
on t.object_id = c.object_id 
and t.name = 'Usuarios' and t.type = 'U' 

В вашем коде, это будет выглядеть так:

public string[] getColumnsName() 
{ 
    List<string> listacolumnas=new List<string>(); 
    using (SqlConnection connection = new SqlConnection(Connection)) 
     using (SqlCommand command = connection.CreateCommand()) 
     { 
      command.CommandText = "select c.name from sys.columns c inner join sys.tables t on t.object_id = c.object_id and t.name = 'Usuarios' and t.type = 'U'"; 
      connection.Open(); 
      using (var reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        listacolumnas.Add(reader.GetString(0)); 
       } 
      } 
     } 
    return listacolumnas.ToArray(); 
} 
+2

Работал как шарм. –

3
SELECT COLUMN_NAME 
FROM 
INFORMATION_SCHEMA.COLUMNS 
WHERE 
TABLE_NAME = 'YourTable' 
+1

Если вы отправляете код, XML или образцы данных, ** PLEASE ** выделите эти строки в текстовом редакторе и нажмите на кнопка «образцы кода» ('{}') на панели инструментов редактора для удобного форматирования и синтаксиса выделите ее! –

3
public string[] getColumnsName() 
    { 
     List<string> listacolumnas=new List<string>(); 
     using (SqlConnection connection = new SqlConnection(Connection)) 
     using (SqlCommand command = connection.CreateCommand()) 
     { 
      command.CommandText = "select column_name from information_schema.columns where table_name = 'Usuarios'"; 
      connection.Open(; 
      using (var reader = command.ExecuteReader(CommandBehavior.KeyInfo)) 
      { 
       reader.Read(); 

       var table = reader.GetSchemaTable(); 
       foreach (DataColumn column in table.Columns) 
       { 
        listacolumnas.Add(column.ColumnName); 

       } 
      } 
     } 
     return listacolumnas.ToArray(); 
    } 
1
sp_columns - http://technet.microsoft.com/en-us/library/ms176077.aspx 

Есть много встроенных в хранимых процедурах для этого типа вещей.

0

В настоящее время существует два способа я мог думать, делать это:

  • В чистом SQL SQL Server можно использовать представление, определенное в INFORMATION_SCHEMA.COLUMNS. Там вам нужно будет выбрать строку для вашей таблицы, соответствующую столбцу TABLE_NAME.
  • Поскольку вы используете C#, вероятно, проще получить имена из экземпляра SqlDataReader, который возвращается ExecuteReader. Класс предоставляет свойство FieldCount, количество столбцов и метод GetName(int), беря номер столбца в качестве аргумента и возвращая имя столбца.
17

Я обычно использую метод GetSchema для получения столбца конкретной информации, этот фрагмент будет возвращать имена столбцов в списке строки:

 using (SqlConnection conn = new SqlConnection("<ConnectionString>")) 
     { 
      string[] restrictions = new string[4] { null, null, "<TableName>", null }; 
      conn.Open(); 
      var columnList = conn.GetSchema("Columns", restrictions).AsEnumerable().Select(s => s.Field<String>("Column_Name")).ToList(); 
     } 
+0

Я уверен, что должен быть другой способ сделать это, но этот тоже хорошо работает ... – Artiom

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