9

是否可以使用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

5 回答 5

22

您需要使用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 时,用于 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"));
}
于 2012-08-28T14:05:39.053 回答
0

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

DataTable table = myReader.GetSchemaTable();

foreach (DataRow myField in table.Rows)
{
    foreach (DataColumn myProperty in table.Columns)
    {
        fileconnectiongrid.Rows.Add(myProperty.ToString());
    }
}
于 2012-08-28T14:32:08.427 回答
0

这将为您提供所有列名,您可以将它们放在 a 中string[]并按照您的喜好使用它们。

foreach(var columnName in DataTable.Columns)
{
  Console.WriteLine(columnName);
}
于 2013-09-27T12:44:31.683 回答
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);
  }
于 2013-11-15T16:16:28.333 回答
0

我使用相同的技术在我的 VB.Net 程序中添加自定义MAX-STRING-LENGTH约束。 TextBox

我使用 SQLSELECT命令获取 4 列的值

    SELECT code_pays
          ,nom
          ,code_pays_short
          ,default_devise
      FROM pays
      ORDER BY nom

我使用IDataReader对象返回的结果来填充DataGridView.

最后,我在Panel包含 4 的 a 中显示每一行的字段TextBox

为了避免UPDATE用于保存文本框中某些记录更改的 SQL 命令由于列值太长而返回错误消息,我在自定义文本框中添加了一个属性,以直接通知用户值的大小重叠。

这是我的表格

在此处输入图像描述

这是用于初始化MaxStringLength属性的 VB.Net 代码

    Private Sub PushColumnConstraints(dr As IDataReader)
        Dim tb As DataTable = dr.GetSchemaTable()
    
        Dim nColIndex As Integer = -1
    
        For Each col As DataColumn In tb.Columns
            If col.ColumnName = "ColumnSize" Then
                nColIndex = col.Ordinal
                Exit For
            End If
        Next
    
        If nColIndex < 0 Then
            oT.ThrowException("[ColumnSize] columns's index not found !")
            Exit Sub
        End If
    
        txtCodePays.MaxStringLength = tb.Rows(0).Item(nColIndex)
        txtPays.MaxStringLength = tb.Rows(1).Item(nColIndex)
        txtShortCodePays.MaxStringLength = tb.Rows(2).Item(nColIndex)
        txtDefaultDevise.MaxStringLength = tb.Rows(3).Item(nColIndex)
    End Sub

For循环中,程序搜索ColumnSize列值中包含的字段的索引。

MaxStringLength 属性使用以下语法分配

tb.Rows(%TEXT-BOX-INDEX%).Item(nColIndex)

.Rows(%TEXT-BOX-INDEX%)用于在 SQL SELECT中识别列的元数据!

.Item(nColIndex)用于获取特定列的元数据值

Item(n) 可以返回字符串或整数,但 VB.Net 会在必要时进行隐式转换。

这行代码也可以很快写

tb.Rows(%TEXT-BOX-INDEX%)(nColIndex)
tb(%TEXT-BOX-INDEX%)(nColIndex)

但它不可读!

注意:MaxStringLength是自定义属性。它不是普通文本框的一部分。

Code Pays (3 lettres)在上面的打印屏幕中,您可以看到程序向用户指示TextBox的长度太大。错误消息显示在StatusBar表单底部。

此信息在单击SAVE生成 SQLUPDATE命令的按钮之前显示。

使用该调用PushColumnConstraints方法的代码如下

    Public Sub FillPanel()
    
        SQL =
    <sql-select>
    
        SELECT code_pays
              ,nom
              ,code_pays_short
              ,default_devise
          FROM pays
          ORDER BY nom
            
    </sql-select>
    
        Dim cmd As New NpgsqlCommand(SQL, cn)
        Dim dr As NpgsqlDataReader
    
        Try
            dr = cmd.ExecuteReader()
        Catch ex As Exception
            ThrowException(ex)
        End Try
    
        Call PushColumnConstraints(dr)
于 2022-03-01T07:17:06.267 回答