2013-04-10 61 views
0

我使用ExecuteReader()。 它只返回最后的结果。我想显示的结果就像tbid_1.Text数组,tbid_1.Texttbid_1.TextSELECT into Array

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

你的代码将出现在期待,一旦你叫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因为您遍历记录)。
+0

thnx解决了 – 2013-04-10 02:22:24