Laden...

DataGridView mit Daten aus Access-Datenbank befüllen - Problem

Erstellt von BlackSimon vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.351 Views
BlackSimon Themenstarter:in
42 Beiträge seit 2018
vor 5 Jahren
DataGridView mit Daten aus Access-Datenbank befüllen - Problem

verwendetes Datenbanksystem: <Access 2007>

Hallo Leute,

Ich habe ein Winforms-Projekt mit einem DatagridView dataGridView1 .
Desweiteren habe ich eine einfache Access-Datenbank mit zunächst nur einer Tabelle "Personen".

Ich bekomme zwar eine Verbindung zur Datenbank, es werden aber keine Daten im Datagridview angezeigt.
Muss man im Datagridview(klick auf Smarttag oben rechts) vorab noch Spalten festlegen?
Also ich habe nichts weiter festgelegt.

Mein Code:



//Verbindung mit DB herstellen und Inhalt der Tabelle Personen in Datagridview laden

        private void button1_Click(object sender, EventArgs e)
        {
            string connetionString = null;
            OleDbConnection cnn;
            OleDbCommand cmd = new OleDbCommand();

            connetionString = "Provider=Microsoft.ACE.OleDb.12.0;Data Source=Datenbank11.accdb";
            cnn = new OleDbConnection(connetionString);


            DataSet ds = new DataSet();
            cmd.Connection = cnn;
            cmd.CommandText = "SELECT * FROM Personen";
            OleDbDataAdapter adapter = new OleDbDataAdapter(cmd);

            try
            {
                cnn.Open();
                MessageBox.Show("Connection Open ! ");

                //laden...

                adapter.Fill(ds);
                dataGridView1.DataSource = ds;


                cnn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Can not open connection ! ");
            }
        }

4.931 Beiträge seit 2008
vor 5 Jahren

Steht denn die DataGridView.AutoGenerateColumns-Eigenschaft (im VS-Designer) auf true?

Ich hoffe mal, das ist nur ein Testprojekt, denn Datenbankzugriffe sollten niemals im UI-Code passieren, s. [Artikel] Drei-Schichten-Architektur.

BlackSimon Themenstarter:in
42 Beiträge seit 2018
vor 5 Jahren

Jetzt gehts, und zwar damit:


         dataGridView1.DataSource = ds.Tables[0];

Aber wovon hängt der Index ab?
Die erste Tabelle die man anlegt bekommt den Index [0], die zweite den Index [1] usw.?

D
261 Beiträge seit 2015
vor 5 Jahren

Man sollte auch den Namen der Tabelle verwenden können:

dataGridView1.DataSource = ds.Tables["Personen"];

Edit: Funktioniert nur wenn man einen DataAdapter mit TableMappings verwendet.

BlackSimon Themenstarter:in
42 Beiträge seit 2018
vor 5 Jahren

Mit dem Namen der Tabelle funktioniert es bei nicht - leider.

Aber..,
ich habe jetzt in der Access-Datenbank eine 2. Tabelle namens "Kontakt" angelegt.
Diese lässt sich aber mit


 dataGridView1.DataSource = ds.Tables[1];

NICHT in das DataGrid laden.

Muss ich den Tabellenindex nicht vorher irgendwo festlegen?

4.931 Beiträge seit 2008
vor 5 Jahren

Es wird das SQL-Kommando ausgeführt und die zurückgegebenen Daten (egal ob nur von einer Tabelle oder mittels eines JOINS von mehreren Tabellen) landen in der ersten DataSet-Table (d.h. mit Index 0).

Wenn du also mehrere Tabellen im DataSet haben möchtest, dann mußt du auch mehrere SQL-Kommandos ausführen.

Ich habe es noch nicht ausprobiert, aber laut der Doku von DbDataAdapter.Fill(DataSet) unterstützt dieser Batch-SQL-Kommandos.
Also probiere mal:


cmd.CommandText = "SELECT * FROM Personen; SELECT * FROM Kontakt";

Und wenn das nicht klappt, dann müßtest du selber jeweils eine DataTable erzeugen und dafür dann DbDataAdapter.Fill(DataTable) aufrufen und anschließend dem DataSet hinzufügen.