【问题标题】:How to get column names of table at runtime in C#?如何在 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 集合。

标签: c# asp.net .net sql-server


【解决方案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】:
    【解决方案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') 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          相关资源
          最近更新 更多