使用GetSchemaTable()仅检索列名称

时间:2012-08-28 14:01:54

标签: c# sql

是否可以使用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());
      }
  }

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

4 个答案:

答案 0 :(得分:20)

您需要使用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.GetSchemaTable

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

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

答案 1 :(得分:0)

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

DataTable table = myReader.GetSchemaTable();

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

答案 2 :(得分:0)

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

foreach(var columnName in DataTable.Columns)
{
  Console.WriteLine(columnName);
}

答案 3 :(得分:0)

//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);
  }