如何在c#运行时获取表的列名
本文关键字:获取 运行时 | 更新日期: 2023-09-27 18:10:42
假设我在SQLServer中有一个名为MyTable的表
ID FirstName LastName
1 Harry Dan
2 Maria Vicente
3 Joe Martin
现在,如果我要在表中插入任何数据,我只需像这样触发插入查询
INSERT INTO MyTable (ID, FirstName, LastName) VALUES (4, Smith, Dan);
但是如果我事先不知道列名,只知道表名怎么办?那么是否有一种方法可以在运行时获得表的列名?
可以使用sql-
SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('TABLE_NAME')
也可以查询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);
}
}
另一个使用纯c#/.NET代码的选项:首先是一个助手方法,这里返回一个简单的列名列表。使用DataTable来保存表模式信息意味着还可以为每个列检索其他信息。如果是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);
简单地通过这个查询:
SELECT * FROM sys.columns
WHERE object_id = OBJECT_ID('dbo.[table_name]')
OR This Query:
SELECT COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_NAME = [table_name]
ORDER BY COLUMN_NAME
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);
}
}
}
这个问题以前在各种线程中都有回答
检查:
如何从SQL Server表中获取列名?
如何从Oracle表中获取列名?
如何列出表中的所有列?