使用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); }