【问题标题】:Get Column value from DataRow从 DataRow 获取列值
【发布时间】:2017-10-24 09:05:30
【问题描述】:

我想我的问题与其他人的不同。

但是有没有办法从 DataRow 获取一行的值? 现在我有以下 foreach 来获取 schemaInfos:

foreach (DataRow row in schemaTable.Rows
{
   if (row.Field<String>("ColumnName") != "id")
   {
      TextBox textBox = new TextBox();
      MaterialDesignThemes.Wpf.HintAssist.SetHint(textBox, UppercaseFirst(row.Field<String>("ColumnName")));
      textBox.Name = row.Field<String>("ColumnName");
      textBox.Tag = row.Field<Boolean>("AllowDBNull");
      textBox.Text = // Here I want to put the value like row.Field<String>("ColumnValue")
      StackPanel.Children.Add(textBox);
   }
}

我的问题是,我也可以通过这个 foreach 获取列的值吗? 正常情况下,我需要执行以下操作才能获取值:

while(reader.Read())
{
   textBox.Text = reader[i].ToString();
}

但我认为我也无法在我的 DataRow foreach 中执行此操作。 也许还有另一个 DataColumn 属性来获取值,例如 row.Field&lt;String&gt;("ColumnValue") 或类似的东西。

我还尝试了以下方法,它只给出了第一列的值,而没有给出其他列的值。

 int i = 1;

 foreach (DataRow field in schemaTable.Rows)
 {
     if (field.Field<String>("ColumnName") != "id")
     {
         TextBox textBox = new TextBox();
         MaterialDesignThemes.Wpf.HintAssist.SetHint(textBox, UppercaseFirst(field.Field<String>("ColumnName")));
         textBox.Name = field.Field<String>("ColumnName");
         textBox.Tag = field.Field<Boolean>("AllowDBNull");

         if (dataReader.Read())
         {
             textBox.Text = dataReader[i].ToString();
         }

         i++;

 StackPanel.Children.Add(textBox);
     }
 }

【问题讨论】:

  • "例如 row.Field("ColumnValue")" 是的,就是这样。问题可以结束了吗?
  • 问题不清楚。似乎您有一个模式表,其中仅包含有关数据库中表的元信息。如果您想要这些值,您应该使用有效的 sql 读取它们,然后通过 DataAdapter 填充 DataTable。
  • 问题是没有(“ColumnValue”)。是的,我阅读了 schemaInfo 以获取 ColumnName 和 AllowDBNull。 ColumnName 是带有 ColumnName 标签的文本框。现在我想将 Column 的值放在 TextBox.Text 属性中。这就是为什么我不能做 while(reader.Read()) 编辑我的问题。
  • 如果您只选择模式表,则没有ColumnValue。此 DataTable 从不包含有关表中值的信息,而仅包含有关列的信息。该表中的每一行都是关于一列的信息行,而不是关于包含每一列值的数据行。
  • 我再次编辑了我的问题。我的 DataReader 只包含 KeyInfo 但仍然给我第一列的第一个值。不是其他人,但事实是,尽管我将 CommandBehaivor.KeyInfo 用于我的 DataReader,但我得到了我想要的值。

标签: c# .net


【解决方案1】:

好的,我找到了解决问题的方法:

using(MySqlCommand cmd = new MySqlCommand())
{
   cmd.Connection = connection;
   cmd.CommandText = sql;
   dataReader = cmd.ExecuteReader(CommandBehavior.KeyInfo);
   schemaTable = dataReader.GetSchemaTable();
   int i = 1;
   while(dataReader.Read())
   {
      foreach(DataRow field in schemaTable.Rows)
      {
         if(field.Field<String>("ColumnName") != "id")
         {
            TextBox textBox = new TextBox();
            textBox.Name = field.Field<String>("ColumnName");
            textBox.Tag = field.Field<Boolean>("AllowDBNull");
            textBox.Text = dataReader[i].ToString();

             StackPanel.Children.Add(textBox);
             i++;
         }
      }
   }

首先我将我的 foreach 循环复制到 using.并测试了我对我的问题编辑的代码,该代码与此代码相似。但其他代码只给了我第一列的值。然后我尝试删除 if(dataReader.Read()) 不起作用,因为我之前需要使用 Read()

所以我将while(dataReader.Read()) 放在顶部,并将我的 foreach 循环放在 while 循环中。

不,我有我想要的:)

【讨论】:

    猜你喜欢
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2012-01-23
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-03
    相关资源
    最近更新 更多