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