使用GetSchemaTable()仅检索列名称

是否可以使用GetSchemaTable()仅检索列名?

我一直试图使用这种方法检索列名(仅),是否可能。

  DataTable table = myReader.GetSchemaTable(); foreach (DataRow myField in table.Rows) { foreach (DataColumn myProperty in table.Columns) { fileconnectiongrid.Rows.Add(myProperty.ColumnName + " = " + myField[myProperty].ToString()); } } 

这段代码检索了大量不需要的表数据,我只需要一个包含列名的列表!:

您需要使用ExecuteReader(CommandBehavior.SchemaOnly))

 DataTable schema = null; using (var con = new SqlConnection(connection)) { using (var schemaCommand = new SqlCommand("SELECT * FROM table", con)) { con.Open(); using (var reader = schemaCommand.ExecuteReader(CommandBehavior.SchemaOnly)) { schema = reader.GetSchemaTable(); } } } 

SchemaOnly :

查询仅返回列信息。 使用SchemaOnly时,SQL Server的.NET Framework数据提供程序在使用SET FMTONLY ON执行的语句之前。

列名称位于每行的第一列中。 我不认为可以省略其他列信息,如ColumnOrdinal,ColumnSize,NumericPrecision等,因为你不能使用reader.GetString但在这种情况下只能使用reader.GetString

但是如果你只想要列名,你的循环是不正确的:

 foreach (DataRow col in schema.Rows) { Console.WriteLine("ColumnName={0}", col.Field("ColumnName")); } 

如果您只想显示列名,请将代码更改为以下代码。 您的原始代码不仅尝试显示列名,还尝试显示实际数据值。

 DataTable table = myReader.GetSchemaTable(); foreach (DataRow myField in table.Rows) { foreach (DataColumn myProperty in table.Columns) { fileconnectiongrid.Rows.Add(myProperty.ToString()); } } 

这将为您提供所有列名称,您可以将它们放在string[] ,并按照您喜欢的方式处理它们。

 foreach(var columnName in DataTable.Columns) { Console.WriteLine(columnName); } 
 //Retrieve column schema into a DataTable. schemaTable = reader.GetSchemaTable(); int index = schemaTable.Columns.IndexOf("ColumnName"); DataColumn columnName = schemaTable.Columns[index]; //For each field in the table... foreach (DataRow myField in schemaTable.Rows) { String columnNameValue = myField[columnName].ToString(); Console.WriteLine("ColumnName " + columnNameValue); }