Zum Inhalt springen

Verbindung mit C# zur AccessDB


songoku187

Empfohlene Beiträge

Guten Tag und Mahlzeit zusammen,

ich habe da mal wieder eine Frage ;).

Versuche gerade eine kleine WindowsForm Anwendung zu erstellen die mir beim Drücken auf den OK Button einen Connect zur DB erstellt und die Datensätze dann in einen Datengrid anzeigt. Aber dazu kommt es erst gar nicht bekomme einen Fehler bei der Connection zur DB.

Fehler lautet:

Die Verbindung wurde nicht geschlossen. Der aktuelle Status der Verbindung ist 'Geöffnet'.

Mein bisheriger Code:


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Data.OleDb;


namespace Access_DB_Auslesen

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }


        private void btnOK_Click(object sender, EventArgs e)

        {

            string pathAccesDB = "D:\\test.MDB";    


            // Verbindung zur Datenbank

            OleDbConnection con = new OleDbConnection();

                con.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" 

                                        + "Data Source=" 

                                        + pathAccesDB;              

                con.Open();



            //Datenbank öffnen

            try

            {

                con.Open();

                MessageBox.Show("Die Datenbank wurde erfolgreich geladen!");

            }

            catch (Exception f)

            {

                //string error = "Fehler bei Verbindungsaufbau!";

                MessageBox.Show(f.Message);


                con.Close();

            }

}

Meine Frage warum :D(keine connection) ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

weil wahrscheinlich noch eine Verbindung zu Access offen ist. Ich wette es hat beim ersten mal funktioniert.

die ganze connection zu Access solltest du außerdem in ein using statement setzen, damit es anständig disposed wird. Wahrscheinlich hast du beim ersten Versuch die Verbindung nicht wieder freigegeben.

Nebenbei: Überleg dir ob du wirklich Access nehmen willst, oder ob ein SQLite, SQL CE oder SQL Server Express nicht besser wäre. Access endet zu 99,9% in Müll.

Link zu diesem Kommentar
Auf anderen Seiten teilen


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Data.OleDb;


namespace Access_DB_Auslesen

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }


        private void btnOK_Click(object sender, EventArgs e)

        {

            string pathAccesDB = "D:\\test.MDB";    


            // Verbindung zur Datenbank

            OleDbConnection con = new OleDbConnection();

                con.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" 

                                        + "Data Source=" 

                                        + pathAccesDB;              

                [B][SIZE="4"]con.Open();[/SIZE][/B]



            //Datenbank öffnen

            try

            {

                [B][SIZE="4"]con.Open();[/SIZE][/B]

                MessageBox.Show("Die Datenbank wurde erfolgreich geladen!");

            }

            catch (Exception f)

            {

                //string error = "Fehler bei Verbindungsaufbau!";

                MessageBox.Show(f.Message);


                con.Close();

            }

}

Meine Frage warum :D(keine connection) ?

Du öffnest die Verbindung zwei Mal.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nebenbei: Überleg dir ob du wirklich Access nehmen willst, oder ob ein SQLite, SQL CE oder SQL Server Express nicht besser wäre. Access endet zu 99,9% in Müll.

Jap da geb ich dir auch vollkommen recht ist eine alte Datenbank der rest ist schon auf MSSQL umgestellt.

@Aliter

danke :upps habe ich übersehen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen zusammen,

habe es hinbekommen meine Daten aus der Access DB in meinem DataGridView anzuzeigen.

Der nächste Schritt ist es die Daten von Access per Button direkt in MSSQL rüber zu schreiben.

Meine Google Recherche hat leider nichts ergeben da viele sagen das ich das ja eigentlich direkt über MSSQL importieren kann aber das will ich nicht da die Daten jeden Tag einmal synchronisiert werden.

Nun meine Frage wie bekomme ich das hin? Eventuell ein paar hilfreiche link ;)

Für die Leute die es Interessiert hier mein bisheriger code:


using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Data.OleDb;


namespace Datagrid_test

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)

        {

            // TODO: Diese Codezeile lädt Daten in die Tabelle "testDataSet._testtbl". Sie können sie bei Bedarf verschieben oder entfernen.

            this.visAM_Seg_1TableAdapter.Fill(this.testDataSet._testtbl);


            // ##########################################################################################################################################


            string pathAccesDB = "D:\\test.MDB";    


            // Verbindung zur Datenbank

            OleDbConnection con = new OleDbConnection();

            con.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;"

                                    + "Data Source="

                                    + pathAccesDB;


            // ##########################################################################################################################################


            //Datenbank öffnen

            try

            {

                con.Open();

                MessageBox.Show("Die Datenbank wurde erfolgreich geladen!");



                //erstellen eine statements

                string query = "SELECT * FROM [testtbl]";



                // erstellen des Adapters

                // durchlauf der einzelnen Datensätze

                // Brücke zwischen DB und tabelle

                OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, con);



                // Coomandbuilder

                OleDbCommandBuilder cBuilder = new OleDbCommandBuilder(dAdapter);



                // erstellen einer Datentabelle die die ergebnise des Statemants anzeigt

                DataTable dTable = new DataTable();



                // füllen der Datentablle

                dAdapter.Fill(dTable);



                // ##########################################################################################################################################


                // Tabellen Daten werden ins DataGrid übertragen 


                //das DataGridViweb

                DataGridView dgView = new DataGridView();


                //BindingSource ist das Objekt welches die Datatabelle im Gridanzeigt

                BindingSource bSource = new BindingSource();


                //BindingSource DataSource

                bSource.DataSource = dTable;


                //DataGridView DataSource

                dgView.DataSource = bSource;


                dAdapter.Update(dTable);


                // ##########################################################################################################################################

            }


            catch (Exception f)

            {

                // Fehler ausgabe!

                MessageBox.Show(f.Message);


                con.Close();

            }

        }



        private void btnDatenSchreiben_Click(object sender, EventArgs e)

        {


        }


    }

}


Bearbeitet von songoku187
Link zu diesem Kommentar
Auf anderen Seiten teilen

Als Idee (unabhängig von C#): Wie wäre es, wenn man die Import-Funktion von MSSQL in einem Script aufruft, welches täglich um X Uhr startet?

Ich weiß nicht ob es da etwas in die Richtung gibt. Z.B. kann man bei MySQL SQL-Dumps über die Konsole erstellen, vielleicht geht das ja auch mit MSSQL (natürlich für die Import-Funktion).

Ungefähr so:


mysqldump [options] --all-databases

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

willst du wirklich Syncronisieren ?? Also meine so dass du auf beiden DB`s arbeitest und die Datensätze abgleichst (Fall1). Oder willst du einfach zum Zeipunkt X die Daten der Access-DB in die MSSQL- DB übertragen (Fall2) ?

Der Fall 1 wird wohl eine Menge Arbeit werden ;)

Der Fall 2 sollte m.E. gar nicht so schwer sein. Du könntest wie folgt vorgehen:

1. Tabelle x der MSSQL- DB leeren

2. Werte der Tabelle x aus Access-DB holen (SELECT)

3. Insert-SQL-Befehl zusammenbauen

4. Insert auf Tabelle x der MSSQL-DB absetzen

5. FERTIG

Dieses Programm kannst du dann jeden TAG um x Uhr aufrufen.

Gruß Hans-Jörg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Oder willst du einfach zum Zeipunkt X die Daten der Access-DB in die MSSQL- DB übertragen (Fall2) ?

Der Fall 2 sollte m.E. gar nicht so schwer sein. Du könntest wie folgt vorgehen:

1. Tabelle x der MSSQL- DB leeren

2. Werte der Tabelle x aus Access-DB holen (SELECT)

3. Insert-SQL-Befehl zusammenbauen

4. Insert auf Tabelle x der MSSQL-DB absetzen

5. FERTIG

Dieses Programm kannst du dann jeden TAG um x Uhr aufrufen.

Danke für die bisherigen Antworten,

@Hans-Jörg

ich möchte eher den Fall 2 die Daten werden zurzeit in eine Access DB gespeichert wird sich in nächster Zeit nicht ändern. (HALT STOPP! Das bleibt alles so wie's hier ist! :D)

Und jetzt muss ich die Anwendung so gestallten das diese Daten einlesen werden und dann auf den SQL Server kopiere(sync). Also beim ersten mal werden alles bisherigen Daten in die SQL Datenbank kopiert und ab da dann nur noch Bsp. morgens einmal automatisch gestartet und die Daten vom Vortag kopiert.

Und meine Idee war eigentlich, da ich die Daten ja schon im DataGridView habe diese daraus "nur" noch in SQL schiebe.

Gibt es da etwas um nur mit dem DataGridView zu arbeiten?

Oder muss ich wie du schon sagst jeden einzelnen Datensatz (schleife) mit dem entsprechenden SQL Statement kopieren.

Wäre schön wenn jemand eventuell code bsp. hätte.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hallo

Ich denke du wirst um ein wenig Handarbeit nicht rumkommen. ICh würde auch keine grafische Oberfläche machen denn das bedeutet ja dass du das Programm bedienen musst und ich würde das eher automatisch machen.

ICh weis ja nicht welche Daten in der Datenbank sind aber als Gedanke kommt mir woher willst du wissen das gestern nicht Daten von vorgestern verändert wurden, deshalb mein Vorschlag mit Tabelle leeren.

Gruß Hans-Jörg

Link zu diesem Kommentar
Auf anderen Seiten teilen

Guten Morgen,

also dass das nicht ohne weiteres geht ist mir jetzt auch bewusst :). Also die grafische Oberfläche ist dafür da das ich mich mit C# und WinForms vertraut mache, und die Oberfläche bekommt dann noch später weitere Funktionen um Bsp. weitere Daten von anderen Quellen einzulesen.

Also ein Datensatz besteht aus:

Datum, Zeit, dec(3,1), dec(3,1), dec(3,1), dec(3,1), dec(3,1), dec(3,1), dec(1,1), dec(1,1)

Zurzeit werden diese Daten hintereinander weg in nur eine Tabelle geschrieben. Also wenn ich das Programm das erste mal ausführe dann werden alle Datensätze in MSSQL übertragen. Und danach sollen halt nur noch die Unterschiede übertragen werden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...