如何在 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# 运行时获取表的列名?的主要内容,如果未能解决你的问题,请参考以下文章