2013-10-15 104 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>標籤,因爲這是我的web服務如何發送數據。

+1

你應該遍歷*行*的'GetSchemaTable',否則你只是獲取元數據的列。這只是描述第一個表格的第二張表格。 – Alejandro

+0

這是在SO和網絡以及MS文檔中看起來像無數個問題的副本。這是一個很好的查詢,可以幫助您開始查找所有現有的答案。我只是把你的問題的標題,並將其插入谷歌: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您可以使用INFORMATION_SCHEMA.COLUMNS定義的視圖。在那裏,您需要選擇表格的行,匹配列TABLE_NAME
  • 由於您使用的是C#,因此可能更容易從ExecuteReader返回的SqlDataReader實例中獲取名稱。該類爲列數提供了屬性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