SELECT into Array

时间:2013-04-10 01:56:37

标签: c# mysql arrays executereader

我使用ExecuteReader()。 它只返回最后的结果。我希望在tbid_1.Texttbid_1.Texttbid_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();
                    }
            }

1 个答案:

答案 0 :(得分: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();

请注意,这是你应该这样做的方式,我只是用它来说明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。)