2016-07-21 23 views
0

Ich habe eine Methode erstellt, mit der ich eine Access-Datenbank mit oledbdatareader durchsuchen kann, aber ich kann nicht herausfinden, wie ich mit einer Schaltfläche zum nächsten Datensatz wechseln kann.Zum nächsten Datensatz mit oledbdatareader wechseln C#

Bitte helfen!

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(); 
     } 

Antwort

0

Sie müssen alles außer reader.Read() aus dem Click-Handler verschieben. Wenn Sie dann zum ersten Mal auf die Schaltfläche klicken (oder beim Starten oder Laden), öffnen Sie den Reader. Wenn jemand auf den Knopf klickt, notiert er Read.

Jetzt öffnen Sie den Reader, lesen alle Daten und schließen den Reader dann jedes Mal, wenn jemand auf den Button klickt.

1

Sie gehen zum nächsten Datensatz, wenn Sie reader.Read() aufrufen, würde vorschlagen, die Daten zu laden, die Sie benötigen, anstatt den nächsten Datensatz aus der Datenbank basierend auf Benutzereingaben zu lesen. Diese

ist, wie Sie das tun

eine DtoObject definieren sollten alle Ihre Felder zuerst

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;} 
} 

Dann in Ihrer Methode fügen Sie eine Liste der DTOs enthält, und ein Verfahren, um sie zu dem laden gültig Formulareingaben und Methoden vorwärts zu bewegen und nach hinten ein Elemente

//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]); 
} 

Dann in Ihrer Methode nur, um alle von ihnen in die Liste zu lesen und den Wert initialisieren der erste Index

//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 
} 

Dann erstellen Sie Ihre Event-Handler

private void nextItemButton_Click(object sender, EventArgs args) 
{ 
    MoveToNextItem(); 
} 

private void prevItemButton_Click(object sender, EventArgs args) 
{ 
    MoveToPreviousItem(); 
}