0

我用ExecuteReader(). 它只返回最后一个结果。我想将结果显示为 , 等中tbid_1.Texttbid_1.Text数组tbid_1.Text

    public void Select(FrmVIRGO frm)
                {

                string query = "SELECT* FROM tb_patient_information ";
                if (this.OpenConnection() == true)
                { //Create Command
                    MySqlCommand cmd = new MySqlCommand(query, connection);
                    //Create a data reader and Execute the command


          MySqlDataReader dataReader = cmd.ExecuteReader();
                        while (dataReader.Read())
                        {

// I think use like this
                       frm.tbid_1.Text = dataReader["id_patient"][1].ToString(); //... id_patient1
                       frm.tbid_2.Text = dataReader["id_patient"][2].ToString(); //... id_patient2
                       frm.tbid_3.Text = dataReader["id_patient"][3].ToString(); //... id_patient3


                        }

                        //close Data Reader
                    dataReader.Close();

                    //close Connection
                    this.CloseConnection();
                    }
            }
4

1 回答 1

1

您的代码似乎期望一旦您调用dataReader.Read(),您就可以通过索引访问所有记录。

IDataReader您的数据阅读器是.NET 数据访问库用来表示“读取查询结果”概念的接口的一个实例。IDataReader一次只能访问一条记录。每次调用dataReader.Read()时,IDataReader前进到下一条记录。当它返回时false,表示您已到达结果集的末尾。

例如,您可以将上面的代码转换为以下内容:

        dataReader.Read();  // dataReader is at 1st record
        frm.tbid_1.Text = dataReader["id_patient"].ToString();

        dataReader.Read();  // dataReader is at 2nd record
        frm.tbid_2.Text = dataReader["id_patient"].ToString();

        dataReader.Read();  // dataReader is at 3rd record
        frm.tbid_3.Text = dataReader["id_patient"].ToString();

请注意,这不是您应该这样做的方式,我只是用它来说明 a 的DataReader工作方式。

如果您期望准确返回 3 条记录,则可以使用类似于上面代码的内容。但是,我会修改它以在您从每条记录中读取数据之前验证它是否dataReader.Read()返回true,并以一种没有意义的方式处理它的情况(例如,抛出一个解释错误的异常、记录错误等)。

不过,一般来说,如果我使用原始 ADO.Net(而不是使用OR/M),我更愿意事先将 中的每条记录转换IDataReader为字典,然后使用它们。

例如,您可以为 编写以下扩展方法DataReader

public static class DataReaderExtensions
{
    public static IList<IDictionary<string, object>> ListRecordsAsDictionaries(this IDataReader reader)
    {
        var list = new List<IDictionary<string, object>>();

        while (reader.Read())
        {
            var record = new Dictionary<string, object>();

            for (var i = 0; i < reader.FieldCount; i++)
            {
                var key = reader.GetName(i);
                var value = reader[i];
                record.Add(key, value);
            }

            list.Add(record);
        }

        return list;
    }
}

此方法遍历IDataReader,并将每一行的值粘贴到Dictionary<string, object>. 我发现这种模式在处理原始 ADO 内容时通常非常有用。

这种方法有几个注意事项:

  • 在从服务器接收到所有数据之前,您无法访问记录(字典实例) 。如果您在DataReader使记录可用时单独处理记录,您实际上可以在其中一些数据仍在传输中时开始处理数据。(注意:这可以通过使此方法返回IEnumerable<IDictionary<string, object>>而不是 来解决IList<IDictionary<string, object>>,并yield return在每条记录可用时使用它来生成。)
  • 如果您正在迭代一个大型数据集,您可能不想实例化那么多字典。最好单独处理每条记录。
  • 您无法访问可以提供有关记录的某些信息(例如,您在遍历记录DataReader时无法使用)。DataReader.GetDataTypeName
于 2013-04-10T02:18:59.470 回答