[英]Move to next record using oledbdatareader C#
我创建了一种方法,可以使用oledbdatareader搜索访问数据库,但是我似乎无法弄清楚如何使用按钮移至下一条记录。
请帮忙!
private void button2_Click(object sender, EventArgs e)
{
System.Data.OleDb.OleDbConnection conn = new
System.Data.OleDb.OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=BoilerSvc_be.mdb";
try
{
conn.Open();
OleDbCommand command = new OleDbCommand("SELECT Equipment.CustID AS CustID,Equipment.Manufacturer AS Manufacturer,Equipment.Model AS Model, Equipment.LastService AS LastService,Initial,Surname,[Address 1],[Address 2],[Address 3],[Post Town],[Post Code],Telephone FROM Contacts INNER JOIN Equipment ON Equipment.CustID = Contacts.CustID WHERE Surname = '" + textBox12.Text + "' OR Initial = '" + textBox12.Text + "' OR[Post Town] = '" + textBox12.Text + "' OR[Post Code] = '" + textBox12 + "'", conn);
command.Parameters.Add(new OleDbParameter("@Name", textBox12));
OleDbDataReader reader = command.ExecuteReader();
while (reader.Read())
{
FirstName.Text = reader["Initial"].ToString();
LastName.Text = reader["Surname"].ToString();
Address1.Text = reader["Address 1"].ToString();
Address2.Text = reader["Address 2"].ToString();
Address3.Text = reader["Address 3"].ToString();
TownCity.Text = reader["Post Town"].ToString();
PostCode.Text = reader["Post Code"].ToString();
Telephone.Text = reader["Telephone"].ToString();
LstSvcDat.Text = reader["LastService"].ToString();
BoilerMan.Text = reader["Manufacturer"].ToString();
BoilerMod.Text = reader["Model"].ToString();
}
// Insert code to process data.
}
finally
{
conn.Close();
}
当您调用reader.Read()
时,您将reader.Read()
下reader.Read()
记录,这将建议您加载所需的数据,而不是根据用户输入从数据库中读取下reader.Read()
记录。
这就是你的做法
应该先定义一个包含所有字段的DtoObject
public class DtoObject
{
public string FirstName { get; set;}
public string LastName { get; set;}
public string Address1 { get; set;}
public string Address2 { get; set;}
public string Address3 { get; set;}
public string TownCity { get; set;}
public string PostCode { get; set;}
public string Telephone { get; set;}
public string LstSvcDat { get; set;}
public string BoilerMan { get; set;}
public string BoilerMod { get; set;}
}
然后在您的方法中添加Dto的列表,将它们加载到有效Form Inputs的方法以及向前和向后移动项目的方法
//in your class
private readonly List<DtoObject> _ls = new List<DtoObject>();
private int _currentIndex = 0;
private void LoadDto(DtoObject object)
{
FirstName.Text = reader["Initial"].ToString();
LastName.Text = reader["Surname"].ToString();
...
BoilerMod.Text = reader["Model"].ToString();
}
private void MoveToNextItem()
{
_currentIndex++;
LoadDtoObject(_ls[_currentIndex]);
}
private void MoveToPreviousItem()
{
_currentIndex--;
LoadDtoObject(_ls[_currentIndex]);
}
然后在您的方法内部读取,只需将它们全部读取到列表中,并将值初始化为第一个索引
//clear existing data
_ls.Clear();
while (reader.Read())
{
var current = new DtoObject();
current.FirstName = reader["Initial"].ToString();
current.LastName = reader["Surname"].ToString();
current.Address1= reader["Address 1"].ToString();
current.Address2= reader["Address 2"].ToString();
current.Address3= reader["Address 3"].ToString();
current.TownCity= reader["Post Town"].ToString();
current.PostCode= reader["Post Code"].ToString();
current.Telephone= reader["Telephone"].ToString();
current.LstSvcDat= reader["LastService"].ToString();
current.BoilerMan= reader["Manufacturer"].ToString();
current.BoilerMod= reader["Model"].ToString();
_ls.Add(current);
}
//if there are any set the first values to current form
if(_ls.Any())
{
_currentIndex = 0;
LoadDto(_ls.First());
}
else
{
//do something to notify no records were found
}
然后创建您的事件处理程序
private void nextItemButton_Click(object sender, EventArgs args)
{
MoveToNextItem();
}
private void prevItemButton_Click(object sender, EventArgs args)
{
MoveToPreviousItem();
}
您需要将除reader.Read()
之外的所有内容移出单击处理程序。 然后,第一次单击按钮(或在启动或加载时),打开阅读器。 当有人点击该按钮,你Read
纪录。
现在,您正在打开读取器,读取所有数据,然后每当有人单击按钮时关闭读取器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.