Laden...

Schleife über DataReader wird nur einmal durchlaufen (DataReader liefert nur ein Element)

Erstellt von Lumiux vor 12 Jahren Letzter Beitrag vor 12 Jahren 6.358 Views
L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren
Schleife über DataReader wird nur einmal durchlaufen (DataReader liefert nur ein Element)

Hey Ich hab ein kleines Problem,
ich habe mein WPF Projekt mit meiner Datenbank verbunden.
Nun sollen die neu hinzugefügten Daten in einer XamDataGrid angezeigt werden,
bei einem Namen macht er das aber bei dem zweiten nicht. Er durchläuft die schleife nur einmal, müsste aber öfter durchgehen vlt. könnt ihr mir ja helfen.

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //fp_GetData();
            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=prakdb.accdb";
            con.Open();
            var objDataTable = new DataTable();
            objDataTable.Columns.Add("ID");
            objDataTable.Columns.Add("Name");
            objDataTable.Columns.Add("Vorname");
            objDataTable.Columns.Add("Wohnort");
            objDataTable.Columns.Add("Plz");
            objDataTable.Columns.Add("Land");
            objDataTable.Columns.Add("Telefonnummer");
            objDataTable.Columns.Add("E-Mail");
            objDataTable.Columns.Add("Strasse und Hausnummer");
            string strSql = "SELECT * from Adressen";
            OleDbCommand cmd = new OleDbCommand(strSql, con);
            OleDbDataReader dr = cmd.ExecuteReader();

            foreach (var objRecord in dr)
            

            
            {
                var objRow = objDataTable.NewRow();

                objRow["ID"] = dr[0];
                objRow["Name"] = dr[1];
                objRow["Vorname"] = dr[7];
                objRow["Wohnort"] = dr[2];
                objRow["Plz"] = dr[3];
                objRow["Land"] = dr[4];
                objRow["Telefonnummer"] = dr[5];
                objRow["E-Mail"] = dr[6];
                objRow["Strasse und Hausnummer"] = dr[9];

                objDataTable.Rows.Add(objRow);
                

          
               

               
            }

            con.Close();
            xamDataGrid1.DataSource = objDataTable.Rows;
     

        }

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

3.825 Beiträge seit 2006
vor 12 Jahren

Der DataReader liest auch nur immer eine Zeile aus der Datenbank.

Mit dr.Read() liest Du die nächste Zeile.

Siehe http://www.seven-c.de/files/datenbankenhowto.htm#5 Kapitel 5

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

Vielen Dank für deine Hilfe leider funktioniert es immer noch nicht 😦.

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

S
24 Beiträge seit 2011
vor 12 Jahren

Du musst schon konkret sagen, was nicht funktioniert bzw. wie die Fehlermeldung lautet. Gut wäre auch, wenn du deinen geänderten Code postest.
Hast du Bernds Tutorial mal näher angesehen? Dort ist alles sehr gut erklärt und deine Anforderungen werden genau abgedeckt.

foreach (var objRecord in dr) 

ersetzen durch

while(dr.Read()) 
L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

Ich bekomme kein Fehlermeldung, es wir einfach nur ein Element in den XamDataGrid geschrieben aber eig. müssten dort 3 reingeschrieben werden

mein neuer Code der immernoch nicht funktioniert

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            //fp_GetData();
            OleDbConnection con = new OleDbConnection();
            con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=prakdb.accdb";



                string strSql = "SELECT * from Adressen";
                OleDbCommand cmd = new OleDbCommand(strSql, con);
                cmd.Connection = con;
                con.Open();
                var objDataTable = new DataTable();
                objDataTable.Columns.Add("ID");
                objDataTable.Columns.Add("Name");
                objDataTable.Columns.Add("Vorname");
                objDataTable.Columns.Add("Wohnort");
                objDataTable.Columns.Add("Plz");
                objDataTable.Columns.Add("Land");
                objDataTable.Columns.Add("Telefonnummer");
                objDataTable.Columns.Add("E-Mail");
                objDataTable.Columns.Add("Strasse und Hausnummer");
                
                OleDbDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    var objRow = objDataTable.NewRow();

                    objRow["ID"] = dr[0];
                    objRow["Name"] = dr[1];
                    objRow["Vorname"] = dr[7];
                    objRow["Wohnort"] = dr[2];
                    objRow["Plz"] = dr[3];
                    objRow["Land"] = dr[4];
                    objRow["Telefonnummer"] = dr[5];
                    objRow["E-Mail"] = dr[6];
                    objRow["Strasse und Hausnummer"] = dr[9];

                    objDataTable.Rows.Add(objRow);
                    xamDataGrid1.DataSource = objDataTable.Rows;

                    
                    
                }
                dr.Close();
                con.Close();

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

2.891 Beiträge seit 2004
vor 12 Jahren

Hast du dir mal im Debugger die DataTable angeguckt, ob da auch alles drin steht?
Etwas eigenartig finde ich, dass du nicht direkt die DataTable als DataSource ans Grid hängst (sondern die Rows-Eigenschaft). Sieht es dann anders aus (xamDataGrid1.DataSource = objDataTable;)?

Wenn du dann eh alles in eine DataTable schreibst, warum nimmst du nicht gleich einen (OleDb)DataAdapter? Dann kannst du mit der DbDataAdapter.Fill-Methode (DataSet) (System.Data.Common) gleich alles in die DataTable schreiben.


var dataTable = new DataTable();

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=prakdb.accdb";
string selectCommandText = "SELECT * from Adressen";

using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectCommandText,connectionString))
	dataAdapter.Fill(dataTable);

xamDataGrid1.DataSource = dataTable;
L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

Hi ich habe es verändert jedoch muss ich bei

xamDataGrid1.DataSource = dataTable.Rows machen ohne Rows bekommt er ein Fehler : Fehler 66 Der Typ "System.Data.DataTable" kann nicht implizit in "System.Collections.IEnumerable" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.)

mein code sieht gerade so aus:

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
                
                var dataTable = new DataTable();
                string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;data source=prakdb.accdb";
                string selectCommandText = "SELECT * from Adressen";
                using (OleDbDataAdapter dataAdapter = new OleDbDataAdapter(selectCommandText, connectionString))
                    dataAdapter.Fill(dataTable);
                 xamDataGrid1.DataSource = dataTable.Rows;
        }

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

2.891 Beiträge seit 2004
vor 12 Jahren

mein code sieht gerade so aus

Und funktioniert oder nicht?
Wenn nicht: Konkrete Fragen stellen.

L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

Nein es funktioniert nicht und meine frage wäre warum ich bei
xamDataGrid1.DataSource = dataTable.Rows das Rows setzen muss bei deinem Lösungsvorschlag benutzt du das nicht ich muss es aber setzten warum ?

tut mir leid für meine Blödheit habe aber erst gestern angefangen wirklich zu programmieren mit c#

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

2.891 Beiträge seit 2004
vor 12 Jahren

Weil ich sonst mit Grids arbeite, die mehrere Sachen als DataSource umgehen können (IEnumerable, IList, DataTable, ...). Wie es aussieht, aktzeptiert das xamDataGrid (ich nehme an, das ist das Infragistics-Grid für WPF?) nur ein Objekt vom Typ IEnumerable.

L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

Was muss ich denn ändern damit nun alle Elemente angezeigt werden?
Ich komm nämlich nicht mehr weiter

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

2.891 Beiträge seit 2004
vor 12 Jahren

Was muss ich denn ändern damit nun alle Elemente angezeigt werden?

Erst einmal wäre zu klären, ob die Datenquelle, die du an das Grid hängst, wirklich alle Elemente enthält.

Denn es könnte ja auch daran liegen, dass du von deiner Abfrage nur ein Element angezeigt bekommst und deshalb auch nur ein Element im Grid angezeigt wird. Ganz anders würde es aussehen, wenn die Datenquelle wirklich mehrere Elemente enthält.

Aber anhand deiner bisherigen Ausführungen ist nicht wirklich ersichtlich, ob nun die Abfrage klappt und die Datenbindung nicht, oder aber andersherum. Und das bekommst du leicht durch Debuggen der entsprechenden Codestelle heraus.

L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

das habe ich ja schon überprüft und es ist alles vorhanden, es wird nur nicht in den xamDatagrid eingebunden und so mit auch nciht angezeigt

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

3.825 Beiträge seit 2006
vor 12 Jahren

Im Debugger siehst Du auch ob Deine Schleife einmal oder 3 Mal durchlaufen wird.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

ja und sie wird nur einmal durchlaufen was mein Problem ist, das ich nicht weiß warum er sie nur einmal durchläuft

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

Danke an alle habs hinbekommen 👍

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

2.891 Beiträge seit 2004
vor 12 Jahren

Und wie, wenn man fragen darf ([Hinweis] Wie poste ich richtig? Punkt 9 - Eigene Lösungen posten)

L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

So hab hier die Lösung:

Ich habe einfach nochmal es so aufgebaut wie ich es am Amfang hatte und habe dann es nochmal so gemacht wie Bernd es meinte und was vorhin nicht ging funktioniert nun.

private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            
                

            OleDbConnection con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;data source=C:\svn\Azubi\praktikant\Hillmer Tim\Datenbanken\prakdb.accdb");
            con.Open();
            
            var objDataTable = new DataTable();            
            objDataTable.Columns.Add("ID");
            objDataTable.Columns.Add("Name");
            objDataTable.Columns.Add("Vorname");
            objDataTable.Columns.Add("Wohnort");
            objDataTable.Columns.Add("Plz");
            objDataTable.Columns.Add("Land");
            objDataTable.Columns.Add("Telefonnummer");
            objDataTable.Columns.Add("E-Mail");
            objDataTable.Columns.Add("Strasse und Hausnummer");
            string strSql = "SELECT * FROM Adressen";            
            OleDbCommand cmd = new OleDbCommand(strSql, con);
            OleDbDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {
                var objrow = objDataTable.NewRow();


                objrow["id"] = dr[0];
                objrow["name"] = dr[1];
                objrow["vorname"] = dr[7];
                objrow["wohnort"] = dr[2];
                objrow["plz"] = dr[3];
                objrow["land"] = dr[4];
                objrow["telefonnummer"] = dr[5];
                objrow["e-mail"] = dr[6];
                objrow["strasse und hausnummer"] = dr[9];

                objDataTable.Rows.Add(objrow);
                
            }
            dr.Close();
            con.Close();
            xamDataGrid1.DataSource = objDataTable.Rows;
            }

        private object objDataTable()
        {
            throw new NotImplementedException();
        }

        private object DataTable()
        {
            throw new NotImplementedException();
        }     

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100

F
10.010 Beiträge seit 2004
vor 12 Jahren

Du hast jetzt also diese ganze Seite gebraucht um diesen riesigen unnötigen Kram zu implementieren, der durch dN!3L 5 Zeiler komplett 5 1/2 vor Stunden fertig gewesen wäre, nur weil Du nicht bereit warst die Grundlagen von ADO.NET vorher mal durchzulesen?

L
Lumiux Themenstarter:in
14 Beiträge seit 2011
vor 12 Jahren

So wie dN!3L es gemacht habe habe ich es ja auch gemacht und es hat nicht funktioniert also hab ich alles nochmal aufgebaut und ja so kam der ganze unnötige kram zustande, tut mir ja leid das ich erst seit 2 Tagen mit C# programmiere.

Es gibt 10 Gruppen von Menschen, die die den Binärcode verstehen und die Anderen 01111000 01000100