14

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

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

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

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

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

4

6 回答 6

15

您可以使用 sql-

SELECT name FROM sys.columns WHERE object_id = OBJECT_ID('TABLE_NAME') 
于 2013-04-23T11:40:08.573 回答
7

或者您可以查询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);
    }
 }
于 2013-04-23T11:40:49.657 回答
5

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

    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);
于 2014-10-07T15:15:23.783 回答
1

只需通过此查询:

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

或此查询:

SELECT COLUMN_NAME
FROM information_schema.columns
WHERE TABLE_NAME = [table_name]
ORDER BY COLUMN_NAME
于 2013-04-23T11:44:24.170 回答
0
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);
                }
            }
        }
于 2018-07-12T13:39:00.730 回答
-1

这个问题之前在各种线程中得到了回答

查看:

如何从 SQL Server 中的表中获取列名?

如何从 Oracle 中的表中获取列名?

如何列出表中的所有列?

于 2013-04-23T11:45:00.797 回答