none
Frage zur dataGridView in c# RRS feed

  • Frage

  • Hallo Leute,

    ich bin im Umgang mit C#, Visual Studio 2010 und MySql noch Anfänger und habe diesen Quelltext geschrieben:

     

    String sql = "SELECT * FROM `"+tabelleAnzeigenComboBox3.Text+"`";
          DataTable datatable = new DataTable();
          MySqlDataAdapter dataAdapter = new MySqlDataAdapter(sql, connection); 
          dataAdapter.Fill(datatable);
    
          dataGridViewAusgabe.DataSource = datatable;
          dataGridViewAusgabe.Show();
    

    Jetzt kann ich in meinem c# Programm jede Tabelle mir anzeigen lassen.

    Jetzt meine Frage: Wie kann ich die Änderungen die man im dataGridView Fenster machen kann, auch an meine MySQL Datenbank schicken?

    Wäre für Tipps Dankbar :D

    Grüße ColleMonster

    Dienstag, 24. Mai 2011 06:55

Antworten

  • Hallo C.,

    • Danke für eure Beiträge

    gern.

    Da ich nicht Deinen kompletten Quellcode sehen kann ... beachte u.a. den (MySql)CommandBuilder (in meinen Links), der die Commands erstellt:

    [MySQL AB :: MySQL 6.0 Reference Manual :: 26.2.3.2 Using MySqlCommandBuilder]
    http://ftp.ku.ac.th/pub/mirror/mysql/doc/refman/6.0/en/connector-net-examples-mysqlcommandbuilder.html

    [Gewusst wie: Binden von Daten an das DataGridView-Steuerelement in Windows Forms]
    http://msdn.microsoft.com/de-de/library/fbk67b6z.aspx

    Du brauchst auch AFAIK nur die Update-Methode und kein vorheriges GetChanges etc, denn das macht Update intern schon automatisch.

    [DbDataAdapter.Update-Methode (DataTable) (System.Data.Common)]
    http://msdn.microsoft.com/de-de/library/z1z2bkx2.aspx


    ciao Frank
    • Als Antwort markiert ColleMonster Donnerstag, 26. Mai 2011 11:11
    Dienstag, 24. Mai 2011 09:54
  • Hallo C.,

    Danke an alle für die Hilfe. Das Beispiel von Marcel läuft bei mir solange ich nur eine Reihe hinzufüge. Wenn ich einen Wert ändern will, bekomme ich eine Ausnahme.

    InvalidOperationException wurde nicht behandelt: Dynamische SQL-Generierung für den UpdateCommand wird nicht für einen SelectCommand unterstützt, der keine Schlüsselspalteninformationen zurückgibt.


    Die Fehlermeldung sagt ja schon alles. Dein SelectCommand gibt keine Schlüsselspalteninformationen zurück. Hier sind die Bedingungen damit die dynamische SQL-Generierung über den CommandBuilder funktioniert:

    1. Mindestens ein Primärschlüssel oder eine eindeutige Tabellenspalte muss vom SELECT-Ausdruck zurückgegeben werden.
    2. SelectCommand muss sich auf eine einzige Tabelle beziehen (keine JOINS, auch nicht in zugrundeliegenden Views).
    3. SelectCommand muss sich auf bearbeitbare Tabellenspalten beziehen (also z.B. keine Expressions).

    (alle weiteren Bedingungen findest Du im unten angeführten Artikel von Bill Vaughn)

    Nehmen wir als Beispiel folgende Tabellendefinitionen:

    A. Tabelle mit definiertem Primärschlüssel

    delimiter $$
    
    CREATE TABLE `customers` (
     `CustomerID` int(11) NOT NULL AUTO_INCREMENT,
     `CompanyName` varchar(45) DEFAULT NULL,
     `Address` varchar(45) DEFAULT NULL,
     PRIMARY KEY (`CustomerID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8$$
    

    B. Tabelle ohne definiertem Primärschlüssel, aber mit einem "ID" im Spaltennamen

    delimiter $$
    
    CREATE TABLE `customersnopk` (
     `CustomerID` int(11) DEFAULT NULL,
     `CompanyName` varchar(45) DEFAULT NULL,
     `Address` varchar(45) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

    C. Tabelle aus der kein Primärschlüssel deduziert werden kann

    delimiter $$
    
    CREATE TABLE `customersnopknoid` (
     `Customer` int(11) DEFAULT NULL,
     `CompanyName` varchar(45) DEFAULT NULL,
     `Address` varchar(45) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
    

    Im letzten Fall (C) wird die von Dir erwähnte InvalidOperationException geworfen, da der CommandBuilder die Primärschlüsselspalte(n) einfach nicht mehr ermitteln kann.

    Lösung 1 (empfohlen):  Du definierst eine Primärschlüsselspalte in Deinen Tabellen.
    Lösung 2: Du erstellst das SQL für die dataAdapter.InsertCommand, dataAdapter.UpdateCommand, dataAdapter.DeleteCommand) manuell.

    Weaning Developers from the CommandBuilder:
    http://msdn.microsoft.com/en-us/library/ms971491.aspx 

    Gruß
    Marcel

    Mittwoch, 25. Mai 2011 14:17
    Moderator
  • Hallo C.,

    na, das was ich gesagt habe, hast Du da aber nicht wirklich eingebaut - egal, gehen wir nochmal von Deinem Beispiel-Projekt (Download) aus.

    Wenn ich jetzt zum Beispiel mal Deinen Code:
    http://cid-88c66749e2b571f2.office.live.com/self.aspx/.Public/sqltest.zip

    benutze mit der Tabelle "dennis", die ich mal so definiert habe:

    • delimiter $$
      CREATE TABLE `dennis` (
        `idDennis` int(11) NOT NULL,
        `Vorname` varchar(45) DEFAULT NULL,
        PRIMARY KEY (`idDennis`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Forums Frage'$$


    ausprobiere, habe ich keine Probleme mit dem Update-Button, wenn ich die aktuellen MySql-Versionen benutze:
    MySQL -> [Download MySQL Community Server]  [Download Connector/Net] [Download MySQL Workbench]


    ciao Frank
    • Als Antwort markiert ColleMonster Montag, 30. Mai 2011 15:05
    Freitag, 27. Mai 2011 20:52

Alle Antworten

  • Hallo C.,

    • Jetzt meine Frage: Wie kann ich die Änderungen die man im dataGridView Fenster machen kann, auch an meine MySQL Datenbank schicken?

    Die Änderungen, die im Grid gemacht werden, werden intern gespeichert.
    Mit der Update-Methode kann man diese in die DB aktualisieren:

    [mysql Tabelle aktualisieren mit Daten aus DataGridView (gefiltert)]
    http://social.msdn.microsoft.com/Forums/de-DE/visualcsharpde/thread/1b8035c3-da6e-484e-85f9-7c558e729fb4/

    Letztlich einfach analog zu:

    [Gewusst wie: Binden von Daten an das DataGridView-Steuerelement in Windows Forms]
    http://msdn.microsoft.com/de-de/library/fbk67b6z.aspx

    nur mit "MySql" vor den entsprechenden Datenbank-Klassen.


    ciao Frank
    Dienstag, 24. Mai 2011 07:27
  • Hallo ColleMonster,

    zum aktualisieren der Datenbank kannst du die Update-Methode des DataAdapters verwenden.
    Gruß
    Philip 
    Dienstag, 24. Mai 2011 07:34
  • Danke für eure Beiträge!

    Ich habe jetzt einen Update Button mit der Update Methode hinzugefügt. Das alleine reicht aber noch nicht. Bekomme jetzt eine Ausnahme...

    "Für ein Update ist ein gültiger Insert-Command erforderlich, wenn eine DataRow Auflistung mit neuen Zeilen weitergegeben wird."

    private void updateButton_Click(object sender, EventArgs e)
        {
          dataAdapter.Update(datatable);
        }
    

    Dienstag, 24. Mai 2011 08:16
  • Den Command musst du vor dem Aufruf der Update-Methode initialisieren.
    Der von Frank gepostete Link sollte dir hierbei eigentlich helfen: http://social.msdn.microsoft.com/Forums/de-DE/visualcsharpde/thread/1b8035c3-da6e-484e-85f9-7c558e729fb4/

    Dienstag, 24. Mai 2011 08:22
  • Hallo C.,

    Hier ist ein Beispiel:

    using System;
    using System.Data;
    using System.Windows.Forms;
    using MySql.Data.MySqlClient;
    
    namespace UpdateMySqlDbFromDgv {
      public partial class Form1 : Form {
        private MySqlDataAdapter dataAdapter;
        private MySqlConnectionStringBuilder connectionBuilder;
        private DataTable datatable;
    
        public Form1() {
          InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e) {
          this.connectionBuilder = new MySqlConnectionStringBuilder
          {
            Server = "127.0.0.1",
            Database = "Test",
            UserID = textBoxUserName.Text,
            Password = textBoxPassword.Text
          };
        }
    
        private void buttonUpdate_Click(object sender, EventArgs e) {
          if (this.dataAdapter == null)
            return;
    
          dataAdapter.Update(datatable);
        }
    
        private void buttonSelect_Click(object sender, EventArgs e) {
          using (MySqlConnection connection = new MySqlConnection(this.connectionBuilder.ConnectionString)) {
            // ToDo: Benutzereingabe immer überprüfen
            String sql = String.Format("SELECT * FROM `{0}`", tabelleAnzeigenComboBox3.Text);
            datatable = new DataTable(tabelleAnzeigenComboBox3.Text);
            this.dataAdapter = new MySqlDataAdapter(sql, connection);
            this.dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            MySqlCommandBuilder builder = new MySqlCommandBuilder(this.dataAdapter);
    
            dataAdapter.Fill(this.datatable);
          }
    
          dataGridViewAusgabe.DataSource = this.datatable;
        }
      }
    }
    



    Um Informationen zum PrimaryKey miteinzubeziehen, mußt Du dataAdapter.MissingSchemaAction verwenden:

    "When the MySQLDataAdapter fills a DataSet, it will create the necessary tables and columns for the returned data if they do not already exist. However, primary key information will not be included in the implicitly created schema unless the System.Data.MissingSchemaAction property is set to System.Data.MissingSchemaAction.AddWithKey."

    MySqlDataAdapter:
    http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqldataadapter.html#connector-net-examples-mysqldataadapter-updatecommand


    Gruß
    Marcel



    Dienstag, 24. Mai 2011 08:38
    Moderator
  • Hallo C.,

    • Danke für eure Beiträge

    gern.

    Da ich nicht Deinen kompletten Quellcode sehen kann ... beachte u.a. den (MySql)CommandBuilder (in meinen Links), der die Commands erstellt:

    [MySQL AB :: MySQL 6.0 Reference Manual :: 26.2.3.2 Using MySqlCommandBuilder]
    http://ftp.ku.ac.th/pub/mirror/mysql/doc/refman/6.0/en/connector-net-examples-mysqlcommandbuilder.html

    [Gewusst wie: Binden von Daten an das DataGridView-Steuerelement in Windows Forms]
    http://msdn.microsoft.com/de-de/library/fbk67b6z.aspx

    Du brauchst auch AFAIK nur die Update-Methode und kein vorheriges GetChanges etc, denn das macht Update intern schon automatisch.

    [DbDataAdapter.Update-Methode (DataTable) (System.Data.Common)]
    http://msdn.microsoft.com/de-de/library/z1z2bkx2.aspx


    ciao Frank
    • Als Antwort markiert ColleMonster Donnerstag, 26. Mai 2011 11:11
    Dienstag, 24. Mai 2011 09:54
  • Danke an alle für die Hilfe. Das Beispiel von Marcel läuft bei mir solange ich nur eine Reihe hinzufüge. Wenn ich einen Wert ändern will, bekomme ich eine Ausnahme.

    InvalidOperationException wurde nicht behandelt.

    Dynamische SQL-Generierung für den UpdateCommand wird nicht für einen SelectCommand unterstützt, der keine Schlüsselspalteninformationen zurückgibt.

    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 MySql.Data.MySqlClient;
    
    namespace sqltest
    {
      public partial class Form1 : Form
      
      {
        private MySqlDataAdapter dataAdapter;
        private MySqlConnectionStringBuilder connectionBuilder;
        private DataTable datatable;
    
        public Form1()
        {
          InitializeComponent();
        }
    
       
        private void Form1_Load(object sender, EventArgs e)
        {
          this.connectionBuilder = new MySqlConnectionStringBuilder
          {
            Server = "localhost",
            Database = "datenbank",
            UserID = "root",
            Password = "sql"
          };
        }
    
        
    
        private void buttonSelect_Click_1(object sender, EventArgs e)
        {
          using (MySqlConnection connection = new MySqlConnection(this.connectionBuilder.ConnectionString))
          {
            //MessageBox.Show("Test");
            // ToDo: Benutzereingabe immer überprüfen
            String sql = String.Format("SELECT * FROM `{0}`", tabelleAnzeigenComboBox3.Text);
            datatable = new DataTable(tabelleAnzeigenComboBox3.Text);
            this.dataAdapter = new MySqlDataAdapter(sql, connection);
            this.dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            MySqlCommandBuilder builder = new MySqlCommandBuilder(this.dataAdapter);
    
            dataAdapter.Fill(this.datatable);
          }
    
          dataGridViewAusgabe.DataSource = this.datatable;
        }
    
        private void buttonUpdate_Click_1(object sender, EventArgs e)
        {
          if (this.dataAdapter == null)
            return;
          try
          {
            dataAdapter.Update(datatable);
          }
          catch (InvalidOperationException f)
          {
            MessageBox.Show("Fehler"+f);
          }
          
        }
      }
    }
    

     

    Mittwoch, 25. Mai 2011 13:14
  • Hallo C.,

    Danke an alle für die Hilfe. Das Beispiel von Marcel läuft bei mir solange ich nur eine Reihe hinzufüge. Wenn ich einen Wert ändern will, bekomme ich eine Ausnahme.

    InvalidOperationException wurde nicht behandelt: Dynamische SQL-Generierung für den UpdateCommand wird nicht für einen SelectCommand unterstützt, der keine Schlüsselspalteninformationen zurückgibt.


    Die Fehlermeldung sagt ja schon alles. Dein SelectCommand gibt keine Schlüsselspalteninformationen zurück. Hier sind die Bedingungen damit die dynamische SQL-Generierung über den CommandBuilder funktioniert:

    1. Mindestens ein Primärschlüssel oder eine eindeutige Tabellenspalte muss vom SELECT-Ausdruck zurückgegeben werden.
    2. SelectCommand muss sich auf eine einzige Tabelle beziehen (keine JOINS, auch nicht in zugrundeliegenden Views).
    3. SelectCommand muss sich auf bearbeitbare Tabellenspalten beziehen (also z.B. keine Expressions).

    (alle weiteren Bedingungen findest Du im unten angeführten Artikel von Bill Vaughn)

    Nehmen wir als Beispiel folgende Tabellendefinitionen:

    A. Tabelle mit definiertem Primärschlüssel

    delimiter $$
    
    CREATE TABLE `customers` (
     `CustomerID` int(11) NOT NULL AUTO_INCREMENT,
     `CompanyName` varchar(45) DEFAULT NULL,
     `Address` varchar(45) DEFAULT NULL,
     PRIMARY KEY (`CustomerID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8$$
    

    B. Tabelle ohne definiertem Primärschlüssel, aber mit einem "ID" im Spaltennamen

    delimiter $$
    
    CREATE TABLE `customersnopk` (
     `CustomerID` int(11) DEFAULT NULL,
     `CompanyName` varchar(45) DEFAULT NULL,
     `Address` varchar(45) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

    C. Tabelle aus der kein Primärschlüssel deduziert werden kann

    delimiter $$
    
    CREATE TABLE `customersnopknoid` (
     `Customer` int(11) DEFAULT NULL,
     `CompanyName` varchar(45) DEFAULT NULL,
     `Address` varchar(45) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
    

    Im letzten Fall (C) wird die von Dir erwähnte InvalidOperationException geworfen, da der CommandBuilder die Primärschlüsselspalte(n) einfach nicht mehr ermitteln kann.

    Lösung 1 (empfohlen):  Du definierst eine Primärschlüsselspalte in Deinen Tabellen.
    Lösung 2: Du erstellst das SQL für die dataAdapter.InsertCommand, dataAdapter.UpdateCommand, dataAdapter.DeleteCommand) manuell.

    Weaning Developers from the CommandBuilder:
    http://msdn.microsoft.com/en-us/library/ms971491.aspx 

    Gruß
    Marcel

    Mittwoch, 25. Mai 2011 14:17
    Moderator
  • Hallo C.,

    • Danke an alle für die Hilfe

    gern. Unsere Beispiele sollten eigentlich alle funktionieren, wenn die DB Primärschlüssel hat.

    Was ich annehme ist, dass Du keine Primärschlüssel in den Tabellen definiert hast.
    Eine selbstdefinierte Insert-Methode ist normal keine besonders empfehlenswerte Methode, obwohl in manchen Situationen notwendig. Nimm den von mir empfohlenen MySqlCommandBuilder.

    [MySQL Command Builder funktioniert nicht / kann Datenbank nicht updaten]
    http://www.vb-magazin.de/forums/forums/p/6067/23947.aspx

     


    ciao Frank


    Mittwoch, 25. Mai 2011 15:36
  • > Frank schrieb: Was ich annehme ist, dass Du keine Primärschlüssel in den Tabellen definiert hast. 

    Wow, sehr originell. Zitierst Du hier jemanden?


    > Frank schrieb: Eine selbstdefinierte Insert-Methode ist normal keine besonders empfehlenswerte Methode, obwohl in manchen Situationen notwendig. 

    Also wat nu? Ja oder ja?


    > Frank schrieb:  Nimm den von mir empfohlenen MySqlCommandBuilder.

    Hat er doch. Und nur weil er Deine Links gelesen hat ;-)

     

     


    Mittwoch, 25. Mai 2011 19:40
    Moderator
  • Hallo Marcel,

    ich schreibe meistens einfach nur meine Meinung und meine Tips zu den Fragen hier und gehe sporadisch auf Schnitzer von anderen ein - etwa bei Dir auf das GetChanges, was Du ja jetzt gottseidank aus deiner Antwort auch gelöscht (nach-editiert) hast. Aber ich mache auch Schnitzer und lerne selber auch immer mit.
    Bzgl. "Dzaebel Update Primärschlüssel" findet Google bspw. 1150 Stellen von mir über die Jahre ;-) 


    ciao Frank
    Mittwoch, 25. Mai 2011 20:56
  • Ich habe jetzt eine Tabelle angelegt und mit meinem Programm aufgerufen. Leider hat sich nix geändert.

     

    CREATE TABLE `customers` (
     `CustomerID` int(11) NOT NULL AUTO_INCREMENT,
     `CompanyName` varchar(45) DEFAULT NULL,
     `Address` varchar(45) DEFAULT NULL,
     PRIMARY KEY (`CustomerID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8$$
    Mittwoch, 25. Mai 2011 21:09
  • > Frank schrieb: gehe sporadisch auf Schnitzer von anderen ein - etwa bei Dir auf das GetChanges, was Du ja jetzt gottseidank aus deiner Antwort auch gelöscht (nach-editiert) hast

    Das GetChanges() hatte in meinem ursprünglichen Code (das ich für das Beispiel hier teilweise wiederverwendet habe) einen ganz anderen Sinn, da dort die Daten an eine Bibliothek weitergegeben wurden. Übrigens wird GetChanges() ganz routinemäßig in Zusammenhang mit Update() verwendet.

    > Frank schrieb: Bzgl. "Dzaebel Update Primärschlüssel" findet Google bspw. 1150 Stellen von mir über die Jahre ;-)

    Ich sprach von diesem Thread. Der erste, der hier MySqlCommandBuilder und den Primärschlüssel erwähnt, war ICH. Das verdient fairerweise eine Erwähnung, oder?

    Donnerstag, 26. Mai 2011 05:51
    Moderator
  • Hallo C.,

    Ich habe jetzt eine Tabelle angelegt und mit meinem Programm aufgerufen. Leider hat sich nix geändert. 
    CREATE TABLE `customers` (
     `CustomerID` int(11) NOT NULL AUTO_INCREMENT,
     `CompanyName` varchar(45) DEFAULT NULL,
     `Address` varchar(45) DEFAULT NULL,
     PRIMARY KEY (`CustomerID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8$$

    Ich habe mir die Mühe gemacht und den von Dir zuletzt geposteten Code mit der o.g. Tabellendefinition getestet. Keine Ausnahme. Der CommandBuilder funktioniert wie erwartet ;-) Solltest Du weiterhin Probleme damit haben, könntest Du ein Test-Projekt auf SkyDrive o.ä. hochladen und hier einen Link posten. Ich werde mir den Code ansehen.

    Gruß
    Marcel

    Donnerstag, 26. Mai 2011 06:07
    Moderator
  • Das wäre ja super nett von dir!

    Ich hoffe das klappt mit dem Link:

    http://cid-88c66749e2b571f2.office.live.com/self.aspx/.Public/sqltest.zip

    Donnerstag, 26. Mai 2011 07:30
  • Oh man ey, jetzt läuft es! Habe mich da wohl etwas doof angestellt. sorry!

    Ein kleines Problem ist da noch. Wenn ich auf den Update Button klicke und dann eine andere Tabelle laden möchte, sind die immer leer.

    Donnerstag, 26. Mai 2011 07:57
  • Hallo C.,

    also war es jetzt der Primärschlüssel, den ich und Marcel erwähnten, der das Problem gelöst hat?

     


    ciao Frank
    Donnerstag, 26. Mai 2011 08:48
  • Hallo C.,

    also war es jetzt der Primärschlüssel, den ich und Marcel erwähnten, der das Problem gelöst hat?

     


    ciao Frank

    Das Beispiel und der Hinweis von Marcel habe mein Problem gelöst.

    Bekomm ihr Geld oder Punkte für das lösen?

    Donnerstag, 26. Mai 2011 09:18
  • Hallo C.,

    also ich bekomme kein Geld. 
    Mir geht es eher darum, gute Lösungen anderen Benutzern zur Verfügung zu stellen.
    Die Punkte oder "Medaillien", die im Forum gelistet werden, werden nicht als Geld umgesetzt, das ist eher, damit sich Benutzer etwas orientieren können.
    Zu MVPs kannst Du hier etwas nachlesen:

    [Microsoft Most Valuable Professional]
    http://mvp.support.microsoft.com/?ln=de


    Zum Thema:

    Das als Antwort markierte Posting enthält keinen Code - ich schätze aber, dass es das Problem mit den Primärschlüsseln war. Der Code scheint ja meinem Link zu http://msdn.microsoft.com/de-de/library/z1z2bkx2.aspx nur mit MySql analog zu sein, insofern - ist nur für mich und andere User - scheint der Primärschlüssel der Knackpunkt gewesen zu sein.

    vielen Dank.


    ciao Frank
    Donnerstag, 26. Mai 2011 11:02
  • Ich hatte deinen Link nicht weiter verfolgt, der von Marcel hatte mir ja schon weiter gebracht. Ich danke dir aber auch recht herzlich!

    Vielleicht kannst du mir ja bei meinem kleinen Problem noch helfen.

    "Ein kleines Problem ist da noch. Wenn ich auf den Update Button klicke und dann eine andere Tabelle laden möchte, sind die Tabellen immer leer."

    Donnerstag, 26. Mai 2011 11:14
  • > Frank schrieb: also war es jetzt der Primärschlüssel, den ich und Marcel erwähnten, der das Problem gelöst hat?
    > C. antwortete: Das Beispiel und der Hinweis von Marcel habe mein Problem gelöst.

    > Frank schrieb: Der Code scheint ja meinem Link zu http://msdn.microsoft.com/de-de/library/z1z2bkx2.aspx nur mit MySql analog zu sein
    > C. antwortete: Ich hatte deinen Link nicht weiter verfolgt, der von Marcel hatte mir ja schon weiter gebracht.


    Dieses Betteln und Schnorren und Druck ausüben, geht mir langsam auf die Nerven, Frank. Ich weiss nicht, wie die Moderation das sieht, was mich angeht, werde ich mich an diesem Thread nicht mehr beteiligen.

    @ColleMonster: Dein Code ist in Ordnung.

    Marcel

    Donnerstag, 26. Mai 2011 11:23
    Moderator
  • Hallo C.,
    • Ich danke dir aber auch recht herzlich!
    gern.
    • "Ein kleines Problem ist da noch. Wenn ich auf den Update Button klicke und dann eine andere Tabelle laden möchte, sind die Tabellen immer leer."
    ich habe Deinen Code mal nachvollzogen ...
    gut, ich würde normal das using wegnehmen und ganz nach oben nur einmalig die Connection öffnen, denn sonst könnte die Connection bei Update_Click im dataAdapter disposed sein, wenn ich mich jetzt auf:
    http://cid-88c66749e2b571f2.office.live.com/self.aspx/.Public/sqltest.zip
    beziehe. Also grob als Ansatz vielleicht so - jetzt mal bei SQL Server etwa so (ansonsten natürlich Deinen Code benutzen, weil Dein Code ja MySql benutzt) :
     SqlConnection connection;
    
     public Form1() { InitializeComponent(); }
    
     private void Form1_Load(object sender, EventArgs e)
     {
      this.connectionBuilder = new SqlConnectionStringBuilder();
      connectionBuilder.DataSource = @".\SQLExpress";
      connectionBuilder.InitialCatalog = "Demo";
      connectionBuilder.IntegratedSecurity = true;
      connection = new SqlConnection(this.connectionBuilder.ConnectionString);
     }
    
     private void buttonSelect_Click_1(object sender, EventArgs e)
     {
      //MessageBox.Show("Test");
      // ToDo: Benutzereingabe immer überprüfen
      String sql = String.Format("SELECT * FROM [{0}]", tabelleAnzeigenComboBox3.Text);
      datatable = new DataTable(tabelleAnzeigenComboBox3.Text);
      this.dataAdapter = new SqlDataAdapter(sql, connection);
      this.dataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
      SqlCommandBuilder builder = new SqlCommandBuilder(this.dataAdapter);
      dataAdapter.Fill(this.datatable);
      dataGridViewAusgabe.DataSource = this.datatable;
     }
    
    bei diesem Code funktioniert bei mir das Update und die Auswahl und es ist nicht leer.
    Es könnte dann wieder an den Tabellen-Definitionen liegen.

    ciao Frank
    Donnerstag, 26. Mai 2011 11:59
  • Oh man, ich habe versucht das Beispiel in mein Programm zu übernehmen und jetzt läuft es gar nicht mehr. Ein klick auf Anzeigen bleibt ohne Wirkung, es wird keine Tabelle angezeigt.

    private MySqlDataAdapter dataAdapter2;
    private MySqlConnectionStringBuilder connectionBuilder2;
    private DataTable datatable2;
    String sql;
    
    //2. Tabelle anzeigen in der dataGridView Button
        private void button8_Click(object sender, EventArgs e)
        {
          
          using (MySqlConnection connection = new MySqlConnection(this.connectionBuilder2.ConnectionString))
          {
            //MessageBox.Show("Test");
            // ToDo: Benutzereingabe immer überprüfen
            sql = String.Format("SELECT * FROM `{0}`", tabelleAnzeigenComboBox3.Text);
            datatable2 = new DataTable(tabelleAnzeigenComboBox3.Text);
            this.dataAdapter2 = new MySqlDataAdapter(sql, connection);
            this.dataAdapter2.MissingSchemaAction = MissingSchemaAction.AddWithKey;
            MySqlCommandBuilder builder = new MySqlCommandBuilder(this.dataAdapter2);
    
            dataAdapter2.Fill(this.datatable2);
          }
    
          dataGridViewAusgabe.DataSource = this.datatable2;
        }
    
        //1. Tabellen in die ComboBox laden Button
        private void tabelleAnzeigenButton2_Click_1(object sender, EventArgs e)
        {
          if (eingeloggt == false)
          {
            MessageBox.Show("Bitte erst einloggen!");
            return;
          }
          tabelleAnzeigenComboBox3.Visible = true;
          
          tabelleAnzeigenComboBox3.Text = "";
          tabelleAnzeigenComboBox3.Items.Clear();
          befehlAusfuehren("SHOW TABLES FROM " + datenbank);
          tabelleAnzeigenComboBox3.Items.AddRange(tabellenNamen);
        }
    //3. Update Button
        private void updateButton_Click(object sender, EventArgs e)
        {
          if (this.dataAdapter2 == null)
            return;
          try
          {
            dataAdapter2.Update(datatable2);
          }
          catch (InvalidOperationException f)
          {
            MessageBox.Show("Fehler" + f);
          }
          
        }
    private void Form1_Load(object sender, EventArgs e)
        {
          this.connectionBuilder2 = new MySqlConnectionStringBuilder
          {
            Server = "localhost",
            Database = "datenbank",
            UserID = "root",
            Password = "sql"
          };
          String text;
          try
          {
            StreamReader sr = new StreamReader("E:\\file.txt");
            text = sr.ReadLine();
            while (text != null)
            {
              zeichen[zaehler] = text;
              //MessageBox.Show(text);
              Console.WriteLine(text);
              text = sr.ReadLine();
              zaehler++;
            }
            sr.Close();
            Console.ReadLine();
            for (int i = 0; i < zeichen.Length+1; i++)
            {
              if (zeichen[i] == "Datenbank:")
              {
                textBox1.Text = zeichen[i + 1];
                //MessageBox.Show(zeichen[i + 1]);
              }
              if (zeichen[i] == "User:")
              {
                textBox2.Text = zeichen[i + 1];
              }
              if (zeichen[i] == "Passwort:")
              {
                textBox3.Text = zeichen[i + 1];
              }
              if (zeichen[i] == "Server:")
              {
                textBox5.Text = zeichen[i + 1];
              }
            }
          }
          catch (Exception ex)
          {
            Console.WriteLine("Exception: " + ex.Message);
          }
          
        }
    
    

    Freitag, 27. Mai 2011 17:42
  • Hallo C.,

    na, das was ich gesagt habe, hast Du da aber nicht wirklich eingebaut - egal, gehen wir nochmal von Deinem Beispiel-Projekt (Download) aus.

    Wenn ich jetzt zum Beispiel mal Deinen Code:
    http://cid-88c66749e2b571f2.office.live.com/self.aspx/.Public/sqltest.zip

    benutze mit der Tabelle "dennis", die ich mal so definiert habe:

    • delimiter $$
      CREATE TABLE `dennis` (
        `idDennis` int(11) NOT NULL,
        `Vorname` varchar(45) DEFAULT NULL,
        PRIMARY KEY (`idDennis`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Forums Frage'$$


    ausprobiere, habe ich keine Probleme mit dem Update-Button, wenn ich die aktuellen MySql-Versionen benutze:
    MySQL -> [Download MySQL Community Server]  [Download Connector/Net] [Download MySQL Workbench]


    ciao Frank
    • Als Antwort markiert ColleMonster Montag, 30. Mai 2011 15:05
    Freitag, 27. Mai 2011 20:52
  • Hi Frank,

    sorry für die späte Antwort. Ja, dass mit dem Update funktioniert, aber wenn ich danach noch eine andere Tabelle laden will, sind die immer leer. Ist das nicht so dei dir?

    Oh man, jetzt gehts.... Medieninformatiker sage ich nur :D
    Montag, 30. Mai 2011 13:33
  • Hallo C.,

    gerade wollte ich antworten, doch, bei mir funktioniert das auch, und tatsächlich funktioniert es jetzt auch bei Dir.

    Super, freut mich.

     

     


    ciao Frank
    Montag, 30. Mai 2011 19:59