songoku187 Geschrieben 14. Mai 2012 Geschrieben 14. Mai 2012 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 (keine connection) ? Zitieren
SilentDemise Geschrieben 14. Mai 2012 Geschrieben 14. Mai 2012 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. Zitieren
Aliter Geschrieben 14. Mai 2012 Geschrieben 14. Mai 2012 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 (keine connection) ? Du öffnest die Verbindung zwei Mal. Zitieren
songoku187 Geschrieben 14. Mai 2012 Autor Geschrieben 14. Mai 2012 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. Zitieren
songoku187 Geschrieben 15. Mai 2012 Autor Geschrieben 15. Mai 2012 (bearbeitet) 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 15. Mai 2012 von songoku187 Zitieren
Aliter Geschrieben 15. Mai 2012 Geschrieben 15. Mai 2012 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 Zitieren
HJST1979 Geschrieben 15. Mai 2012 Geschrieben 15. Mai 2012 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 Zitieren
songoku187 Geschrieben 15. Mai 2012 Autor Geschrieben 15. Mai 2012 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! ) 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. Zitieren
HJST1979 Geschrieben 15. Mai 2012 Geschrieben 15. Mai 2012 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 Zitieren
songoku187 Geschrieben 16. Mai 2012 Autor Geschrieben 16. Mai 2012 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. Zitieren
Empfohlene Beiträge
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.