在 C# 中检索列名

Posted

技术标签:

【中文标题】在 C# 中检索列名【英文标题】:Retrieve Column name in C# 【发布时间】:2015-09-10 23:11:33 【问题描述】:

我正在寻找关于如何检索列名的 SO,我尝试了一些解决方案,但是当我使用这种方法时,例如,我收到了这些列名,而不是我的实际列名(ID、状态、标题等.):

TABLE_CATALOG TABLE_SCHEMA TABLE_NAME

TABLE_TYPE

 using (SqlConnection connection = new SqlConnection(this.ConnectionString))
      

        System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
        builder.ConnectionString = this.ConnectionString;
        string server = builder.DataSource;
        string database = builder.InitialCatalog;

        connection.Open();
        DataTable schema = connection.GetSchema("Tables");
        Tables = new List<Table>();
        foreach (DataRow row in schema.Rows)
        
            /* Add Table */
            Table t = new Table();
            string tableName = row[2].ToString();
            t.Name = tableName;

            /* Add columns */
            //DataTable dtCols = connection.GetSchema("Columns", new[]  "StarTrackerDB", null, "dbo.Tickets" );
            t.Columns = new List<Column>();

            foreach (DataColumn column in row.Table.Columns)
            
                Column c = new Column();
                c.Name = column.ColumnName;
                t.Columns.Add(c);
            

            Tables.Add(t);
        
    

编辑:

我想在 C# 中检索它,即不在我的代码中执行 SQL 查询字符串。

EDIT2

当前输出:

TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE

预期输出:

身份证 状态 标题

等等。表中的列名。 string tableName 设置正确。

【问题讨论】:

SQL Server: How do you return the column names from a table? 的可能重复项 发布输出(实际和期望)会有很大帮助 它在描述中有所说明,但在这里再次出现:“我收到这些列名,而不是我的实际列名(ID、状态、标题等):[输出]”我会尝试改写如果很难理解的话。 您正在寻找元数据。也许这会让你开始***.com/questions/22053829/… 【参考方案1】:

我编辑了您的代码,并能够使用以下代码获取表格和列。

   public void teste***()
    
        using (SqlConnection connection = new SqlConnection(this.ConnectionString))
        

            System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
            builder.ConnectionString = this.ConnectionString;
            string server = builder.DataSource;
            string database = builder.InitialCatalog;

            connection.Open();


            DataTable schemaTables = connection.GetSchema("Tables");

            foreach (System.Data.DataRow rowTable in schemaTables.Rows)
            
                String TableName = rowTable.ItemArray[2].ToString();

                string[] restrictionsColumns = new string[4];
                restrictionsColumns[2] = TableName;
                DataTable schemaColumns = connection.GetSchema("Columns", restrictionsColumns);

                foreach (System.Data.DataRow rowColumn in schemaColumns.Rows)
                
                    string ColumnName = rowColumn[3].ToString();
                
            


        
    

【讨论】:

非常感谢亲爱的先生,它就像一个魅力!【参考方案2】:

获取当前数据库中所有列的架构信息

DataTable allColumnsSchemaTable = connection.GetSchema("Columns");

您可以指定目录、架构、表名、列名来获取指定的列。 您可以对 Column 使用四个限制,因此您应该创建一个 4 成员数组。 对于数组,0-member 代表 Catalog; 1-member 代表 Schema; 2-member 代表表名; 3-member 代表列名。

例如获取表 MyTable 的列:

String[] columnRestrictions = new String[4];
columnRestrictions[2] = "MyTable";
DataTable myTableSchemaTable = connection.GetSchema("Columns", columnRestrictions);

要从这些表中获取数据:

var columnDetails = from info in table.AsEnumerable()
                         select new 
                            TableCatalog = info["TABLE_CATALOG"],
                            TableSchema = info["TABLE_SCHEMA"],
                            TableName = info["TABLE_NAME"],
                            ColumnName = info["COLUMN_NAME"],
                            DataType = info["DATA_TYPE"]
                         ;

获取当前数据库中所有IndexColumns的架构信息

DataTable allIndexColumnsSchemaTable = connection.GetSchema("IndexColumns");

您可以指定目录、架构、表名、约束名、列名来获取指定的列。 您可以对 Column 使用五个限制,因此您应该创建一个 5 个成员数组。 对于数组,0-member 代表 Catalog; 1-member 代表 Schema; 2-member 代表表名; 3-member 代表约束名称; 4-member 代表列名。

String[] indexColumnsRestrictions = new String[5];
indexColumnsRestrictions[2] = "Course";
indexColumnsRestrictions[4] = "CourseID";
DataTable courseIdIndexSchemaTable = connection.GetSchema("IndexColumns", indexColumnsRestrictions);

要从这些表中获取数据:

var columnDetails = from info in indexColumnsTable.AsEnumerable()
                     select new 
                        TableSchema = info["table_schema"],
                        TableName = info["table_name"],
                        ColumnName = info["column_name"],
                        ConstraintSchema = info["constraint_schema"],
                        ConstraintName = info["constraint_name"],
                        KeyType = info["KeyType"]
                     ;

【讨论】:

以上是关于在 C# 中检索列名的主要内容,如果未能解决你的问题,请参考以下文章

从表中检索列名 -Redshift

从不同的表中检索列名?

在 C# 中比较两个数据表的列名

无效的列名“数学” - 从数据库中检索数据

Oracle SQL 从执行计划中检索具有表名的列名作为表

选择语句:列名无效,在 C# 中使用 Dapper