Information

  • Informatik
  • C#
  • Datenbank: Access

Zurreal.de

Fantasy Art ~ Phantastische Kunst

Fantasy Art ~ Phantastische Kunst

Please click on 'Switch Style'.
The style of the website will change.

Bitte klicken Sie auf 'Switch Style'.
Die Gestaltung der Webseite wird sich ändern.

Access: Allgemein

using System.Data.OleDb;

Microsoft Access Database Engine (2010) wird benötigt.
https://www.microsoft.com/de-DE/download/details.aspx?id=13255

Access-DB zum C#-Projekt hinzufügen
Projekt, Neue Datenquelle hinzufügen, Datenbank, DataSet, Neue Verbindung, Microsoft Access-Datenbankdatei, Durchsuchen, '.accdb' auswählen, Öffnen, OK, usw.


/* ### OleDB ### */
/* Command, Connection, Data Source */

OleDbCommand cmd = new OleDbCommand();
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString =
"Provider = Microsoft.ACE.OLEDB.12.0;" + @"Data Source = C:\DB.accdb;";

Steht immer am Anfang.


/* ### ExecuteNonQuery ### */
/* Open, Execute, MBox, Close */

cmd.Connection = conn;
conn.Open();
/* Ergibt das Sinn --> int i = cmd..? */
/* Wäre reader = cmd... nicht besser? */
/* Ich weiß es nicht mehr... */
int i = cmd.ExecuteNonQuery();
MessageBox.Show(i.ToString() + " BlaBla");
conn.Close();

Jede Veränderung an der Datenbank (ändern, löschen, einfügen) wird erst mit ExecuteNonQuery tatsächlich ausgeführt und abgeschlossen.


Access: Tabelle auslesen


OleDbDataReader reader;


/* ### OleDB ### */
/* Command, Connection, Data Source */


cmd.CommandText = "SELECT * FROM TBL ORDER BY ID;";
cmd.Connection = conn;


try
{
  conn.Open();
  reader = cmd.ExecuteReader();
  while(reader.Read())
  {
    ListBox.Items.Add(
    reader[0] + ";" +
    reader[1] + ";" +
    reader[2]);
  }
  reader.Close();
  conn.Close();
}


catch (Exception ex)
{
  MessageBox.Show(ex.Message);
  Application.Exit();
}

TBL = Tabelle, ID = Feld mit ID-Nr.
Soviele reader[x] nehmen, wie es Felder in der Tabelle gibt.

 

 


Access: Parameter-Abfrage


OleDbDataReader reader;


/* ### OleDB ### */
/* Command, Connection, Data Source */


cmd.CommandText = "SELECT * FROM TBL WHERE Name Like ?;";
/* Name, wahlweise mit +"%" */
cmd.Parameters.Add
("Name", OleDbType.Char, 255).Value = txt_Suche.Text + "%";
cmd.Connection = conn;


try
{
  conn.Open();
  reader = cmd.ExecuteReader();
  while(reader.Read())
  {
    ListBox.Items.Add(
    reader[0] + ";" +
    reader[1] + ";" +
    reader[2]);
  }
  reader.Close();
  conn.Close();
}


catch (Exception ex)
{
  MessageBox.Show(ex.Message);
  Application.Exit();
}

Sternchen *
Prozent: %
Joker für ein Zeichen
Unterstrich: _
Joker Parameter
Fragez: ?

Access: Datensatz einfügen


/* ### OleDB ### */
/* Command, Connection, Data Source */


cmd.CommandText = "INSERT INTO TBL VALUES (?,?,?)";
/* ?,, = ID */
cmd.Parameters.Add
("ID", OleDbType.Integer).Value = ID;
/* ,?, = Name */
cmd.Parameters.Add
("Name", OleDbType.Char,50).Value = txt_Nam.Text;
/* ,,? = Typ */
cmd.Parameters.Add
("Typ", OleDbType.Char,50).Value = txt_Typ.Text;


/* ### ExecuteNonQuery ### */
/* Open, Execute, MBox, Close */

Beispiel: TBL hat 3 Datenfelder (?,?,?): ID, Name, Typ.
Gewählte ID muss verfügbar sein.

ExecuteNonQuery:
Das tatsächliche Ausführen vom CommandText.

("Name", OleDbType.Char, 50)
(Datenfeld, OleDbType.Datentyp, Maximalgröße)

  • OleDbType:
    • Char
    • Integer
    • Double
    • String gibt es nicht!

Access: Datensatz löschen

/* Zeilen_Nr ist Id */
if(Zeilen_Nr != 0) {

/* ### OleDB ### */
/* Command, Connection, Data Source */


cmd.CommandText =
"DELETE FROM TBL WHERE ID = ?";
cmd.Parameters.Add
("ID", OleDbType.Integer).Value = Zeilen_Nr;


/* ### ExecuteNonQuery ### */
/* Open, Execute, MBox, Close */

}

else
{
 MessageBox.Show("Kein Datensatz ausgewählt");
}

...


Access: Datensatz ändern

/* Zeilen_Nr ist Id */
if(Zeilen_Nr != 0) {

/* ### OleDB ### */
/* Command, Connection, Data Source */


cmd.CommandText =
"UPDATE TBL SET Feld1 = ?, Feld2 = ? WHERE ID LIKE ?";
/* Feld1 wird aus der TextBox */
/* gelesen und hinzugefügt    */
cmd.Parameters.Add
("Feld1", OleDbType.Char, 50).Value = txt_Feld1.Text;
/* Feld2 ... */
cmd.Parameters.Add
("Feld2", OleDbType.Char, 50).Value = txt_Feld2.Text;
/* ID ... */
cmd.Parameters.Add
("ID", OleDbType.Integer).Value = Zeilen_Nr;


/* ### ExecuteNonQuery ### */
/* Open, Execute, MBox, Close */

}

else
{
 MessageBox.Show("Kein Datensatz ausgewählt");
}

Beispiel: TBL hat 3 Datenfelder: Feld1, Feld2, ID.


Access: Formular-Abfrage


/* Pfad */
private string Verbindung =
"Provider = Microsoft.ACE.OLEDB.12.0;" +
@"Data Source = C:\db.accdb";

Da rein schreiben:
public partial class [name] : Form

private void cmd_X_Click(...)
{

/* Pfad */
OleDbConnection conn = new OleDbConnection(Verbindung);
/* FormularAbfrage */
OleDbCommand cmd = new OleDbCommand("FormularAbfrage", conn);
cmd.CommandType = CommandType.TableDirect;
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
DataSet ds = new DataSet();


try
{
conn.Open();
/* Name des Datenfelds wählen */
da.Fill(ds, "Datenfeld");
conn.Close();
/* In DGV ausgeben */
DGV.DataSource = ds;
DGV.DataMember = "Datenfeld";
}


catch (Exception ex)
{
MessageBox.Show(ex.Message);
Application.Exit();
}

}

...


Access: Statische Abfrage


....

....

...?


Verfügbare ID finden (A)


int ID_A = 1;


while(reader.Read())
{
  ListBox.Items.Add(
  reader[0] + ";" +
  reader[1]);

  if (ID_A == Convert.ToInt32(reader[0]))
  {
    ID_A++;
  }

}

Wenn es die ID gleichen Wertes schon gibt, dann zähle 1 zur ID.


Namen und Spalten der Tabelle auslesen & OpenFile-Dialog


string Pfad = "", TabName = "";
bool AuswahlGetroffen = false;
bool TabellenNameBekannt = false;


OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter =
"Access (*.accdb)|*.accdb|Alle (*.*)|*.*";

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Pfad = openFileDialog1.FileName;
lbx_DBTabellen.Items.Clear();
txt_AuswahlDB.Text = Pfad;
AuswahlGetroffen = true;
txt_Info.Clear();
lbx_DBSpalten.Items.Clear();
txt_AuswahlTAB.Clear();
}


if (AuswahlGetroffen == true)
{
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString =
"Provider = Microsoft.ACE.OLEDB.12.0;"
+ @"Data Source = " + Pfad
+ ";";

/* Alle Tabellennamen ausgeben */
conn.Open();
DataTable Tabellen =
conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[]
{ null, null, null, "TABLE" });

  foreach (DataRow row in Tabellen.Rows)
  {
  lbx_DBTabellen.Items.Add(row[2]);
  }

conn.Close();
conn.Dispose();
AuswahlGetroffen = false;
}


lbx_DBSpalten.Items.Clear();

/* Prüfen, ob Item in Liste ausgewählt wurde */
if (lbx_DBTabellen.SelectedIndex < 0)
{
 MessageBox.Show("Keine Auswahl");
}
else
{
 /* Ausgewählter TabellenName als String */
 TabName = lbx_DBTabellen.GetItemText(lbx_DBTabellen.SelectedItem);
 txt_AuswahlTAB.Text = TabName;
 TabellenNameBekannt = true;
}

/* SpaltenNamen herausfinden */
if (TabellenNameBekannt == true)
{
 OleDbConnection conn = new OleDbConnection();
 DataTable Spalten;
 conn.ConnectionString =
 "Provider =
 Microsoft.ACE.OLEDB.12.0;"
 + @"Data Source = "
 + Pfad + ";";
 conn.Open();

 /* Retrieve schema information about columns */
 /* Restrict to just the selected TABLE */
 Spalten =
 conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new Object[]
 { null, null, TabName, null });

 /* List the column name from */
 /* each row in the schema table */
 for (int i = 0; i < Spalten.Rows.Count; i++)
 {
  lbx_DBSpalten.Items.Add(Spalten.Rows[i].ItemArray[3]);
 }
 conn.Close();
 TabellenNameBekannt = false;
}

Folgende Form-Elemente werden benötigt:

  • lbx_DBTabellen
  • lbx_DBSpalten
  • txt_AuswahlDB
  • txt_Info

Verweise:


Listbox: Selected Item & Clear


private void listbox_SelectedIndexChanged(...)
{
  string Zeile = null;
  int Zeilen_Nr = 0;
  /* Splitten beim Trennzeichen */
  Zeile = listbox.SelectedItem.ToString();
  string[] Array_Auswahl;
  Array_Auswahl = Zeile.Split(';');
  /* Auswahl jenes Eintrages, */
  /* der die ID enthalten muss */
  Zeilen_Nr = Convert.ToInt32(Array_Auswahl[0]);
}

Listbox: Zeilennummer auslesen
Listbox_SelectedIndexChanged: ListBox, Doppelklick.


ListBox.Items.Clear();

ListBox-Items löschen.


MySQL


...

MySQL Befehle können aus Access kopiert werden:
Erstellen, Abfrage-Entwurf, [Anpassen, Sortierung, ...], Ansicht, SQL.