【问题标题】:Using MySQL Data Reader使用 MySQL 数据阅读器
【发布时间】:2015-04-16 13:09:49
【问题描述】:

我不熟悉使用 Data Reader,我需要以下代码的帮助,我想从数据库中检索单个数据。

MySqlDataAdapter data = new MySqlDataAdapter(cmd);
                    conn.Open();
                    DataTable dt = new DataTable();
                    data.Fill(dt);
                    gridView1.DataSource = dt;

                    int retrievedValue = 0;
                    using (MySqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            if ((int)reader["order_status"] == 0)
                            {
                                retrievedValue = (int)reader.GetValue(0);

                                    GridView View2 = sender as GridView;
                                    e.Appearance.BackColor = Color.Green;
                                    e.Appearance.BackColor2 = Color.ForestGreen;
                            }
                        }
                    }

【问题讨论】:

  • order_status 列的类型是什么?你还需要使用== 进行相等检查,= 是赋值运算符。
  • 它包含一个数值 1, 2, 3, 4, 5 它是一个 INT

标签: c# mysql datareader


【解决方案1】:

reader["order_status"] 返回object,因为你告诉它是一个已经整数,你需要先把它转换成int

您还需要使用== operator,因为它是一个相等运算符。 = operator 是赋值运算符。

if ((int)reader["order_status"] == 0)

或者您可以将GetInt32 method 与它的从零开始的 列号一起使用。假设它是您的查询返回的第一列,您可以像这样使用它;

if(reader.GetInt32(0) == 0)

顺便说一句,如果您只想获取单个值,我强烈怀疑您可能想使用 ExecuteScalar 方法,因为它获取的是第一行的第一列。然后您可以将查询构造为SELECT order_status FROM ... 等。

【讨论】:

  • @KevinRodriguez 如果您要获取的值是第一行的第一列,您可以使用ExecuteScalar 方法,如int value = (int)cmd.ExecuteScalar();。请记住,您的查询可以获取多行多列。这不会破坏这种方法。 ExecuteScalar 方法获取第一行的第一列,命令中的其他值被忽略。
  • 我没搞清楚,代码不会让我检索值为 0 的行?
  • 您的cmd 查询到底是什么?顺便说一句,当您使用ExecuteScalar 时,您将不需要ExecuteReader
【解决方案2】:

一定要在while (reader.Read())之前分配一个变量,否则会出错。完成使用后关闭数据阅读器。像这样:

 using (MySqlDataReader reader = cmd.ExecuteReader())    
    {

    int retrievedValue = 0;

          while (reader.Read())
          {
                retrievedValue = (int)reader.GetValue(0);
                if (retrievedValue == 0)
                {

                    GridView View2 = sender as GridView;
                                    e.Appearance.BackColor = Color.Green;
                                    e.Appearance.BackColor2 = Color.ForestGreen;
                }
                else if (retrievedValue == 1)
                {

                    GridView View2 = sender as GridView;
                                    e.Appearance.BackColor = Color.Red;
                                    e.Appearance.BackColor2 = Color.ForestGreen;
                }
          }//and so on...
          reader.Close();
    }

我希望这是您正在寻找的。​​p>

【讨论】:

  • 谢谢,这段代码会检索值为 0 的行吗?
  • 您要从哪个列号检索数据?如果您想从第一列检索,则使用retrievedValue = dr.GetValue(0) 或从第二列,retrievedValue = dr.GetValue(1) 等。请注意,它只会使用 1 行,但您必须在 dr.GetValue 中指定您想要的列。
  • 您可能还需要将数据转换为数据类型,例如:Convert.ToInt32(dr.GetValue(0));,但对于字符串,您不需要:dr.GetString(0)
  • order_status 列,它的值范围为 1 - 6,如果一行的值为 1,我需要将 gridview 行绘制为红色,如果为 2,则需要将其绘制为绿色等。我得到一个错误在结果中找不到指定的列:order_status
  • 该错误可能是由您的查询中的拼写错误引起的。确保您的列名、表格等拼写正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 2012-06-24
  • 2015-06-26
  • 2013-01-25
  • 1970-01-01
相关资源
最近更新 更多