从SQL Server获取列名

12

我正在尝试获取存储在 SQL Server 2008 R2 中的表的列名。

我已经尝试了所有方法,但好像找不到如何实现。

目前这是我的 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
这似乎是SO和网络上无数问题的重复,以及MS文档中的重复。以下是一个好的查询,可以帮助您找到所有现有答案的起点。我只是将您的问题标题输入谷歌搜索引擎:http://bit.ly/GXswgz - Andrew
7个回答

28
您可以使用以下查询获取您的表的列名。下面的查询获取给定名称的用户表的所有列:
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();
}

23
我通常使用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();
        }

11
SELECT COLUMN_NAME
FROM   
INFORMATION_SCHEMA.COLUMNS 
WHERE   
TABLE_NAME = 'YourTable' 

3
如果您发布代码、XML或数据示例,请在文本编辑器中突出显示这些行,并单击编辑器工具栏上的“代码示例”按钮( { })以使其格式化和语法高亮显示! - marc_s
我认为这个解决方案更易于阅读和实现。 - KWallace

3

原帖已经接近目标,只需要进行一些微小的更改即可。以下是我的解决方案。

   public List<string> GetColumns(string tableName)
    {
        List<string> colList = new List<string>();
        DataTable dataTable = new DataTable();


        string cmdString = String.Format("SELECT TOP 0 * FROM {0}", tableName);

        if (ConnectionManager != null)
        {
            try
            {
                using (SqlDataAdapter dataContent = new SqlDataAdapter(cmdString, ConnectionManager.ConnectionToSQL))
                {
                    dataContent.Fill(dataTable);

                    foreach (DataColumn col in dataTable.Columns)
                    {
                       colList.Add(col.ColumnName);
                    }
                }                   
            }
            catch (Exception ex)
            {
                InternalError = ex.Message;
            }
        }


        return colList;
    }

2
虽然这可能解决问题,但最好强调您所更改、添加/删除的内容,以使OP能够理解问题的根源,未来任何其他人都不必搜索您到底做了什么。 - Fabulous
在最近的编辑中,我刚刚删除了用于不同解决方案模式的死代码,因为它已经变得无关紧要。 - Sierra
任何你拥有的上下文,都应该通过编辑将其添加到你的答案中,以便可以在一个地方找到它。 - Fabulous
作为帮助说明,以澄清代码中与此问题/响应示例无关的任何项目:ConnectionManager.ConnectionToSQL是用于所使用的SQL Server的SQL连接对象。而InternalError是该代码所使用的类中的公共字符串对象。这两者都与本问题无关。我只想防止因它们而产生任何无关的问题。 - Sierra

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

目前,我能想到两种方法来实现这个:

  • 在纯 SQL Server SQL 中,您可以使用 INFORMATION_SCHEMA.COLUMNS 中定义的视图。在那里,您需要选择与列 TABLE_NAME 匹配的表行。
  • 由于您正在使用 C#,从 ExecuteReader 返回的 SqlDataReader 实例中获取名称可能更容易。该类提供了一个属性 FieldCount,用于计算列数,并且提供了一个方法 GetName(int),以其参数为列号并返回列名。

0
sp_columns - http://technet.microsoft.com/en-us/library/ms176077.aspx

有许多内置的存储过程可用于此类事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接