Laden...

Daten in eine Access DB schreiben

Erstellt von UnoDosTres vor 16 Jahren Letzter Beitrag vor 16 Jahren 3.937 Views
U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren
Daten in eine Access DB schreiben

verwendetes Datenbanksystem: <ACCESS>

Hallo,

bin absoluter C# Anfänger. Zum üben habe ich mir vorgenommen ein kleines Projekt zu schreiben in dem ich Domains und die Zugänge verwalten kann.

Habe mir mit Access eine leere DB angelegt. Auf der Form haben ich ein DBListeView welches ich auch erfolgreich mit der vorhandenen Access-DB verbunden habe.
Auf der Form habe ich etliche Textfelder, ich möchte die Werte der Felder in die DB schreiben. Wie gehe ich jetzt vor?
Welche Komponente etc. muss ich nutzen?

Danke und Gruss
UnoDosTres

J
3.331 Beiträge seit 2006
vor 16 Jahren

Siehe 🛈 OpenBook VC# Kap.26. Bedenke aber, dass es sich um Kap.26 handelt, also viele Kenntnisse schon vorgesetzt werden!

Für DB-Zugriffe müssen immer die passenden Klassen verwendet werden: Sql* für MS-SQL Server, Fb* für Firebird oder MySql* für MySql; für Access gelten OleDb*.

Jürgen

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Danke,

werde mir das mal durchlesen.

Gruss

UnoDosTres

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Leider hilft mir das nur sehr bedingt weiter. (jedenfalls bei diesem konkreten Problem)

Ich habe auch im Internet einiges gefunden, jedoch bezieht sich das immer auf das Scenario wenn man die Datenbank noch gar nicht verbunden hat.
Es wird dann ein neues DataSet erzeugt etc...

Ich habe die Datenbank aber über den Assisten eingebunden. Das ListView zeigt diese ja auch korrekt an.

Habe in der Hilfe folgendes Gefunden:


try
{
    this.Validate();
    this.customersBindingSource.EndEdit();
    this.customersTableAdapter.Update(this.northwindDataSet.Customers);
    MessageBox.Show("Update successful");
}
catch (System.Exception ex)
{
    MessageBox.Show("Update failed");
}


Was ist nicht verstehe ist, wo gebe ich die Daten an die gespeichert werden sollen?
Ich muss doch irgenwie/irgendwo einen INSERT o.ä. machen und ihm dann sagen welche Daten er wohin schreiben soll. ?(

149 Beiträge seit 2006
vor 16 Jahren

Hallo UnoDosTres,

Ich persönlich finde mit dem Assistenten einbinden geht evtl. leichter und schneller aber gerade zum lernen ist es sinnvoll per Hand eine Verbindung zur Db Herzustellen. Ich versuch dir das mal an nem Beispiel zu zeigen:

        
OleDbConnection cs;
OleDbCommand cd = new OleDbCommand();
OleDbDataAdapter da = new OleDbDataAdapter();
DataSet ds = new DataSet();

public void db_verbinden(string conStr, string db_name)
        {
            if (File.Exists(db_name))
            {
                cs = new OleDbConnection();
                cs.ConnectionString = conStr;
            }
            else
            {
                error = "Datenbank konnt nicht gefunden werden.";
                MessageBox.Show(error);
            }
        }

So muss der Connectionstring (conStr) in etwa aussehen:

conStr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DEINEDB.mdb";

Ein Insert würde dann so aussehen:

        public DataTable insert(string sql_cmd)
        {
            try
            {
                ds.Dispose();
                cd.Dispose();
                cd = new OleDbCommand(sql_cmd, cs);
                ds = new DataSet();
                cs.Open();
                cd.ExecuteNonQuery();
                da.Fill(ds);
                cs.Close();
                return ds.Tables[0];
            }
            catch (OleDbException e)
            {
                MessageBox.Show(e.ToString());
                return ds.Tables[0];
            }
        }

Der sql_cmd wäre dann halt dein INSERT Befehl.

Hoffe ich konnte helfen.

Gruß
roeb

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Danke für die Ausfürliche Hilfe,

leider ist es genau das was ich eigendlich nicht möchte. Ich möchte gerne den Aisstenten benutzen - Das ist ja der "casus knacktus"
Nur ich finde nichts an Beispielen die mir aufzeigen wie ich dann weiter vorgehen muss. Keine Ahnung vieleicht suche ich ja an der falschen Stelle, oder nach den Falschen Stichworten, aber weger google noch die Hilfe hat mich weitergebracht.

149 Beiträge seit 2006
vor 16 Jahren

Hab es leider noch nie mit dem Assi gemacht, aber hab was in der MSDN gefunden, evtl hilft es dir ja. Musst dich mal durchwühlen.

J
3.331 Beiträge seit 2006
vor 16 Jahren

Original von UnoDosTres
Ich habe die Datenbank aber über den Assisten eingebunden. Das ListView zeigt diese ja auch korrekt an...

Was ist nicht verstehe ist, wo gebe ich die Daten an die gespeichert werden sollen?
Ich muss doch irgenwie/irgendwo einen INSERT o.ä. machen und ihm dann sagen welche Daten er wohin schreiben soll. ?(

Das ist eines der Probleme, wenn man den Assistenten mit TableAdapter verwendet: Man sieht nicht, was gemacht wird, und kann kaum prüfen, was ausgeführt werden soll und was nicht klappt.

Der INSERT-Befehl dürfte vom TableAdapter automatisch erstellt worden sein und steht (vermutlich) in der Designer.cs des DataSet. Der Update-Befehl prüft bei allen Rows der DataTable den **RowState **und entscheidet danach, ob der Datensatz unverändert ist oder per Insert/Update/Delete an die Datenbank zu übergeben ist.

Unabdingbare Voraussetzung dafür (die oft übersehen wird, noch ein Problem beim Assistenten): Die Tabelle benötigt einen PrimaryKey; dieser muss im SelectCommand benutzt werden. Nur damit kann der TableAdapter die "Speichern"-Befehle erstellen.

Ich hoffe, das macht die Probleme etwas klarer. Aber auch ich rate davon ab, sich auf den Assistenten zu beschränken. Für einen Anfänger kann er (durch Lektüre des Quelltexts) die Hintergründe erläutern; aber Lernen geht "ohne" besser. Jürgen

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Hm...ja ich denke ich werde das ganze manuel versuchen.

Trotzdem schon komisch das es diese Funktion gibt und man damit solche Probleme bekommt. 🤔

149 Beiträge seit 2006
vor 16 Jahren

Original von UnoDosTres
Trotzdem schon komisch das es diese Funktion gibt und man damit solche Probleme bekommt. 🤔

Microsoft und seine Assistenten müsstest du doch kennen von deinem Betriebssystem 😉

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren
Relativer Pfad

Hallo,

ich werde die DB jetzt per Hand einbinden. Allerdings habe ich ein Problem mit dem relativen Pfad:

 string datei = Application.StartupPath + "\\domains.mdb";

            InitializeComponent();

            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=datei;");
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM dom ORDER BY ID", conn);

            da = new OleDbDataAdapter(cmd);

            OleDbCommandBuilder cb = new OleDbCommandBuilder(da);

            ds = new DataSet();

            da.Fill(ds, "dom");

            grid1.DataSource = ds;

            grid1.DataMember = "dom";

Wenn ich das Programm ausführe stürzt es ab und er sagt "datei nicht gefunden"
Wie binde ich den String "Datei" korrekt ein?

R
317 Beiträge seit 2006
vor 16 Jahren

OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + datei + ";");

so müsste es gehen 🙂

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Supi, die Fehlermedlung kommt nicht mehr. Allerdings wird der Inhalt der Datenbank auch nicht angezeigt. Das Grid bleibt einfach leer.

149 Beiträge seit 2006
vor 16 Jahren

            ds = new DataSet();
            
            conn.Open();
            da.Fill(ds, "dom");
            conn.Close();

            grid1.DataSource = ds;

Jetzt müsste es gehen.

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Hi,

das klappt leider auch nicht. Das Grid bleibt einfach leer, auch die Tabellennamen werden nicht angezeigt.

Hier mal der komplette Code:


string datei = Application.StartupPath + "\\domains.mdb";

            InitializeComponent();

            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + datei + ";"); 
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM dom ORDER BY ID", conn);

            da = new OleDbDataAdapter(cmd);

            OleDbCommandBuilder cb = new OleDbCommandBuilder(da);

            /*ds = new DataSet();

            da.Fill(ds, "dom");

            grid1.DataSource = ds;

            grid1.DataMember = "dom";*/
            ds = new DataSet();

            conn.Open();
            da.Fill(ds, "dom");
            conn.Close();
            grid1.DataSource = ds; 
U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Leider besteht das Problem immernoch, Das Grid bleibt einfach Leer. Kann mir evtl jemand einen Tipp geben? Ich weiss nicht wo der Fehler liegen könnte.

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Hallo,

leider bin ich nicht weitergekommen.
Habe mir via


 MessageBox.Show(conn.DataSource.ToString());

Den Pfad der DB ausgeben lassen und dieser ist Korrekt.
Also muss es ja an dem Grid liegen (?) Muss ich da noch irgend etwas bestimmtes Einstellen?

1.274 Beiträge seit 2005
vor 16 Jahren

Hallo,

binde dein Grid mal an das Table-Property im Dataset und nicht an das ganze Dataset.

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Das DataSet hat nur eine Eigenschaft die "TABLES" heisst. Meinst du das?
Das jedenfalls klappt auch nicht.
?(

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

Bin immer noch bei Null.


private void Form1_Load(object sender, EventArgs e)      
        {
            string datei = Application.StartupPath + "\\domains.mdb";

            InitializeComponent();

            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + datei + ";");
          
            OleDbCommand cmd = new OleDbCommand("SELECT * FROM dom ORDER BY ID", conn);
            conn.Open();
            da = new OleDbDataAdapter(cmd);

            OleDbCommandBuilder cb = new OleDbCommandBuilder(da);

       
            ds = new DataSet();

            
            
           
            da.Fill(ds, "dom");
            
            
            grid1.DataSource = ds.Tables[0];
            conn.Close();
            //MessageBox.Show(conn.DataSource.ToString());          


        }

Langsamm verzweifel ich. Ist das wenigstens ansatzweise richtig was ich hier mache?

1.274 Beiträge seit 2005
vor 16 Jahren

Sind im Objekt ds.Tables[0] unter Rows Datensätze vorhanden?

lg
LG

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

in der Tabelle ist ein (Test)Datensatz vorhanden.

U
UnoDosTres Themenstarter:in
27 Beiträge seit 2007
vor 16 Jahren

OK. Ich habe es jetzt hinbekommen. schwitz
Irgendwie war der ganze Code den ich da fabriziert hatte wohl total für den A****
🙂

Habe es jetzt so gelöst:


string datei = Application.StartupPath + "\\domains.mdb";
            string conString = @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + datei + ";";
            OleDbConnection conn;
            OleDbCommand command = new OleDbCommand();
            OleDbDataAdapter adapter = new OleDbDataAdapter();



            // Verbindung ersteelen und Öffnen          
            conn = new OleDbConnection(conString);
            command = conn.CreateCommand();

            // DataSet erstellen
            DataSet ds = new DataSet();

            //DataSet clearen
            grid1.DataSource = null;

            ds = new DataSet();

            conn.Open();
            command.CommandText = "SELECT * FROM dom ORDER BY ID";
            adapter = new OleDbDataAdapter(command);
            adapter.Fill(ds);
            // close the connection
            conn.Close();
            grid1.DataSource = ds.Tables[0];