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 ! ");
}
}
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.
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.?
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.
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?
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.