如何在 C# 运行时获取表的列名?

Posted

技术标签:

【中文标题】如何在 C# 运行时获取表的列名?【英文标题】:How to get column names of table at runtime in C#? 【发布时间】:2013-04-16 14:40:22 【问题描述】:

假设我在 SQLServer 中有一个名为 MyTable 的表

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

现在如果我必须在表中插入任何数据,我将像这样简单地触发插入查询

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

但是如果我事先不知道列名怎么办,我只知道表名。那么有没有办法在运行时获取表的列名呢?

【问题讨论】:

您正在将数据插入到运行时才知道结构的表中?恕我直言,这听起来像是一个糟糕的场景。 @Jake1164,这对于完全断开连接的系统很常见。考虑一个示例,您有一个集中式数据存储,该存储用作促进者在您一无所知的地理分散服务之间共享数据。现在考虑您可以发送一个对象,利用其属性,并为您一无所知的表构建INSERT 语句 - 您所知道的只是属性与架构匹配并且该表是假定到那里。 简而言之,我可以想到更多您不知道架构的场景。 除了关于查询系统元数据的所有答案之外,如果您更喜欢“纯”.NET 解决方案,那么您可以使用SMO Table object 并检查Columns 集合。 【参考方案1】:
var ColName = "";
        var model = new AttributeMappingSource().GetModel(typeof(DataClassesDataContext));
        foreach (var mt in model.GetTables())
        
            if (mt.TableName == "dbo.Table_Name")
            
                foreach (var dm in mt.RowType.DataMembers)
                
                    ColName = dm.MappedName + ", ";
                    Response.Write(ColName);
                
            
        

【讨论】:

【参考方案2】:

使用纯 C# / .NET 代码的另一种选择: 首先是一个辅助方法,这里返回一个简单的列名列表。使用 DataTable 保存表模式信息,意味着还可以为每一列 fx 检索其他信息。如果是 AutoIncrement 列等。

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

【讨论】:

似乎人们很难注意到 C# 解决方案而不是 SQL 答案的问题(虽然,它有点令人困惑,因为问题包含一些 SQL 代码):) :) 【参考方案3】:

这个问题之前已经在不同的帖子中回答过

检查:

How can I get column names from a table in SQL Server?

How can I get column names from a table in Oracle?

How do I list all the columns in a table?

【讨论】:

【参考方案4】:

只需通过这个查询:

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

OR 这个查询:

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

【讨论】:

【参考方案5】:

或者您可以查询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);
    
 

【讨论】:

【参考方案6】:

你可以使用sql-

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

【讨论】:

以上是关于如何在 C# 运行时获取表的列名?的主要内容,如果未能解决你的问题,请参考以下文章

c# - 如何在运行时从模块代码中获取 PowerShell 模块版本

使用 PDO 时如何获取原始表/列名?

如何在 c# 中运行多个任务并在完成这些任务时获取事件?

如何在 php 中使用 implode 获取数据库表的列名

如何使用 C# 获取 Access 数据库中的列列表?

动态生成列名时如何获取kendo选择的行值