如何获取SQL SELECT语句中的列列表?

时间:2011-06-21 04:40:18

标签: c# sql sql-server

我想获取从SQL SELECT语句返回的列名列表。有人可以建议一个简单的方法吗?

我有一个工具,允许用户使用任何SQL SELECT语句定义查询。然后以自定义方式呈现查询结果。要设置演示文稿,我需要知道列名称,以便用户可以存储有关每列的格式设置。

顺便说一句,格式设置都是通过ASP.NET网页创建的,因此查询结果将最终在.NET中,如果这有助于人们有任何想法。

有什么想法吗?

6 个答案:

答案 0 :(得分:4)

您应该可以使用GetName方法执行此操作。这样的事情可能是:

SqlDataReader mySDR = cmd.ExecuteReader();
for(int i = 0;i < mySDR.FieldCount; i++)
{
   Console.WriteLine(mySDR.GetName(i));
}

这是你可以完全从asp.net页面完成的事情。不需要特殊/额外的SQL。

答案 1 :(得分:3)

假设SQL Server:您可以使用SET FMTONLY来返回元数据(而不是实际数据),例如:

USE AdventureWorks2008R2;
GO
SET FMTONLY ON;
GO
SELECT * 
FROM HumanResources.Employee;
GO
SET FMTONLY OFF;
GO

答案 2 :(得分:1)

你可以通过以下方式获得

注意:您需要填写数据集的DataTable .........

DataSet1 DataSet1 = new DataSet1();
DataTable dt = DataSet1.Tables(0);
DataColumn dc = null;

foreach (DataColumn dc_loopVariable in dt.Columns) {
    dc = dc_loopVariable;
    Response.write(dc.ColumnName.ToString() + " " + dc.DataType.ToString() + "<br>");
}

答案 3 :(得分:1)

另一种返回元数据的方法是

select top 0 * from table

答案 4 :(得分:0)

如果您知道表格名称,可以尝试使用:

desc <table_name>

我假设您使用的是SQL Server。

或作为替代方案:

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TableNameGoesHere'
ORDER BY ORDINAL_POSITION

如果您要使用ASP.NET

,可能需要使用第二个选项

答案 5 :(得分:0)

如果您需要有关每个列的更多信息,如size,ordinal等,这将为您提供更多的列名称。列出了一些最重要的属性,但还有更多属性。

注意,DataObjects.Column是用于存储列信息的POCO。您可以在代码中自行滚动。另外,请注意我也推导出.Net类型,对于将SQL数据类型转换为.Net(C#)类型非常有用。 ConnectionString和TableName将由调用者提供。

            using (SqlConnection conn = new SqlConnection(ConnectionString))
            {
                conn.Open();

                SqlCommand comm = new SqlCommand("Select top(1) * from " + TableName + " Where 1=0");
                comm.CommandType = CommandType.Text;
                comm.Connection = conn;
                using (SqlDataReader reader = comm.ExecuteReader(CommandBehavior.KeyInfo))
                {
                    DataTable dt = reader.GetSchemaTable();
                    foreach (DataRow row in dt.Rows)
                    {
                        //Create a column
                        DataObjects.Column column = new DataObjects.Column();

                        column.ColumnName = (string)row["ColumnName"];
                        column.ColumnOrdinal = (int)row["ColumnOrdinal"];
                        column.ColumnSize = (int)row["ColumnSize"];
                        column.IsIdentity = (bool)row["IsIdentity"];
                        column.IsUnique = (bool)row["IsUnique"];

                        //Get the C# type of data
                        object obj = row["DataType"];
                        Type runtimeType = obj.GetType();
                        System.Reflection.PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType");
                        column.type = (Type)propInfo.GetValue(obj, null);

                        //Set a string so we can serialize properly later on
                        column.DataTypeFullName = column.type.FullName;

                        //I believe this is SQL Server Data Type
                        column.SQLServerDataTypeName = (string)row["DataTypeName"];

                        //Do something with the column
                    }
                }
            }