mySQL-DB mit C# anzapfen und in DataGridView ausgeben

Hallo,

ich habe die Suchfunktion bemüht und bereits diverse Anleitungen durchgearbeitet, aber bislang keine Lösung für mein Problem gefunden. Ich hoffe also, dass Ihr mir helfen könnt. Ich bin von Delphi umgestiegen und habe trotz guter C++-Kenntnisse einige Probleme :rolleyes:

Aufgabe ist, nach dem Programmstart die Verbindung zu einer mySQL-DB im Internet herzustellen, was auch klappt (ich hab hier mal XXX für den tatsächlichen String hingeschrieben):

Code:
            strConn = "XXX";
            try
            {
                conn = new MySql.Data.MySqlClient.MySqlConnection();
                conn.ConnectionString = strConn;
                //conn.Open();
                //MessageBox.Show("Konnektierung erfolgreich");
                verbindungHerstellenToolStripMenuItem.Enabled = false;
                verbindungtrennenToolStripMenuItem.Enabled = true;
                datenExportierenToolStripMenuItem.Enabled = true;
                onlineRegistrierungenToolStripMenuItem.Enabled = true;
            }
            catch (MySql.Data.MySqlClient.MySqlException ex)
            {
                MessageBox.Show(ex.Message);
            }

Über einen Menüpunkt wird dann ein Formular aufgerufen, das die Daten einer bestimmten Tabelle zur Kontrolle anzeigen soll. In .NET 2.0 geht das offenbar in Tabellenform nur über ein DataGridView, das ich also im Formular eingebettet habe. Allerdings bekomme ich es nicht hin, das im Grid auch die Daten angezeigt werden. Der Code des Formulars sieht so aus:

Code:
    public partial class Form_DatenVerwalten : Form
    {
        private MySql.Data.MySqlClient.MySqlConnection conn;
        private MySql.Data.MySqlClient.MySqlDataAdapter myAdapter;
        private MySql.Data.MySqlClient.MySqlCommand myCommand; 
        private string strSQL = "";

        public Form_DatenVerwalten(MySql.Data.MySqlClient.MySqlConnection Connection)
        {
            InitializeComponent();
            conn = new MySql.Data.MySqlClient.MySqlConnection();
            conn.ConnectionString = Connection.ConnectionString;
        }

        private DataSet GetData(string sql)
        {
            DataSet myData = new DataSet();
            myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();
            myCommand = new MySql.Data.MySqlClient.MySqlCommand();

            myCommand.CommandText = sql;
            myCommand.Connection = conn;
            myAdapter.SelectCommand = myCommand;
            myAdapter.Fill(myData);

            return myData;
        }

        private void Form_DatenVerwalten_Load(object sender, EventArgs e)
        {
            strSQL = "SELECT * FROM anmeldungen";
            dsDaten = GetData(strSQL);
            
            
        }
    }

Der Konstruktor übernimmt als Parameter die Verbindung zur Datenbank, so dass ich auch hier darauf zugreifen kann. "dsDaten" ist ein DataSet, das ich mit Hilfe des Assistenten angelegt habe. Es steht als DataSource für das DataGridView eingetragen. Das DataGridView enthält die Datenspalten (zunächst nur Name und Vorname sowie eine zusätzliche Spalte, die mit einer fortlaufenden Nummer gefüllt werden soll, die nicht aus der DB ausgelesen wird).

Wie kann ich nun folgendes realisieren:

Code:
Für alle vorhandenen Datensätze
  Füge dem DataGridView eine neue Zeile hinzu
  Erzeuge Nr.
  Lies Name und Vorname aus dem aktuellen Datensatz
  Schreibe Nr., Name, Vorname in die entsprechenden Spalten
Gehe zu nächstem Datensatz

Für eine Senkrechtstellung des Holzbalkens vor meinem Kopf wäre ich sehr dankbar! :p
 

Christian Kusmanow

Erfahrenes Mitglied
Hallo Jochen_Schneider!

Willkommen im Forum! :)

Hast auch hier im Forum gesucht?
Schlüsselwörter: dataset, databind ; Forum: .NET auch in Unterforen
Falls Du noch Fragen hast, melde Dich einfach wieder.
Kann Dir aber nicht versprechen das ich heut wieder Antworten kann.
Dafür gibt es hier aber noch ne ganze Menge mehr versierte User...

MfG,
cosmo

PS: Du bist einer der wenigen hier der ordentlich Pascal und Camel cased. Weiter so (!)
 
Zuletzt bearbeitet:
Hallo Cosmo,

vielen Dank für die nette Begrüßung. In der Tat habe ich auch bereits in diesem Forum gesucht, werde aber noch mal nachschauen. Bei der Vielfalt hier übersieht man ja schnell etwas. Eine customized-Antwort auf mein Problem wäre natürlich der Idealfall :)

Ich bitte um Verzeihung, aber Dein PS habe ich nicht verstanden. Ich case Pascal und Camel ordentlich? Was bedeutet das? :confused:
 

vault-tec

Erfahrenes Mitglied
Hallo Jochen!

@camelCasing:
Bezeichner sollen in C# klein anfangen aber jeder neue Wortteil soll groß beginnen. Beispiel bei dir: "verbindungtrennenToolStripMenuItem"

@PascalCasing:
Methoden sollen in C# groß anfangen und auch jeder neue Wortteil soll groß beginnen. Beispiel bei dir: "GetData(...)"

Das meint cosmo...

Gruß, Niko
 

SixDark

Erfahrenes Mitglied
Hi!

Ich komme grad mit Deinem 'DataGridView' nicht so recht klar, was meinst Du damit?
Oder denke ich mir das richtig und Du hast auf Deinem Formular ein DataGrid abgelegt?
Denn wenn das so ist, dann schau Dir mal die Eigenschaften 'DataSource' und 'DataMember' des DataGrids an, da kannst Du DataSet und DataTable eintragen.

MfG ..::SD::..

PS @ Azmodan:
Also ich finde es oftmals etwas sehr pingelig was die Schreibweise angeht. Nur weil jemand in einem Buch schreibt, man solle es so oder so machen rennen alle hinterher....
Ich schreibe z.B. bei Methoden das Verb grundsätzlich klein "getData()", egal ob ich in VB.NET, C#, Java oder PHP was programmiere... Somit habe ich für mich einen Überblick und muss mir nicht bei jeder Sprache was Neues angewöhnen.
 
Zuletzt bearbeitet:
Hallo Azmodan,

vielen Dank für die Erläuterungen. Ich bemühe mich in der Tat um Konsistenz und Konsequenz in meinem Quellcode, dann ist er für mich zu einem späterem Zeitpunkt auch einfacher nachzuvollziehen. Grundsätzlich ist es jedoch IMHO eine reine Geschmacksfrage, zumindest wenn man alleine an einem Projekt sitzt und keine anderen Personen sich einlesen müssen.

@SixDark,

das Steuerelement heisst tatsächlich DataGridView (ist offenbar neu in .NET 2.0). Ein DataGrid steht mir nicht zur Verfügung. Hier ist der vom Designer angelegte Code:

Code:
this.dataGrid_Registrierungen = new System.Windows.Forms.DataGridView();

Ich nutze übrigens Visual C# Express 2005, falls das wichtig ist.
 

Christian Kusmanow

Erfahrenes Mitglied
:offtopic:
Jochen_Schneider hat gesagt.:
vielen Dank für die Erläuterungen. Ich bemühe mich in der Tat um Konsistenz und Konsequenz in meinem Quellcode, dann ist er für mich zu einem späterem Zeitpunkt auch einfacher nachzuvollziehen. Grundsätzlich ist es jedoch IMHO eine reine Geschmacksfrage, zumindest wenn man alleine an einem Projekt sitzt und keine anderen Personen sich einlesen müssen.
[thread=231193]Benennung der Steuerlemente - Thread[/thread]
Ist gar net so lang her, als ich umgestiegen bin... Hat mir aber nur Vorteile gebracht. :)
 
Ich habe gerade in einem anderen Thread folgendes Schnipsel gefunden:

Code:
ds.Tables.Add(dt);
DataGrid1.DataSource = dt;
DataGrid1.DataBind();

Das DataGridView besitzt nun aber leider keine DataBind() - Methode... :mad:

Interessanterweise gibt es den DatenTyp DataGrid aber auch weiterhin, er wird nur nicht in der Toolbox für Steuerelemente angezeigt. Ich werde mal versuchen, das DataGridView in ein DataGrid umzuwandeln. Vielleicht klappt es ja dann.
 
Endlich habe ich das Problem gelöst!

Ich habe das DataGridView in ein DataGrid geändert (von dessen Existenz ich erst hier erfahren habe) und den Code etwas angepasst:

Code:
        private DataTable GetData(string sql)
        {
            DataTable myData = new DataTable();
            myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();
            myCommand = new MySql.Data.MySqlClient.MySqlCommand();

            myCommand.CommandText = sql;
            myCommand.Connection = conn;
            myAdapter.SelectCommand = myCommand;
            myAdapter.Fill(myData);

            return myData;
        }

        private void Form_DatenVerwalten_Load(object sender, EventArgs e)
        {
            DataTable tableTemp = new DataTable();
            strSQL = "SELECT name, vorname FROM anmeldungen";
            tableTemp = GetData(strSQL);
            DataRow temprow = tableTemp.Rows[0];

            DataRow row = dsDaten.Tables["Table_Registrierungen"].NewRow();
            row["Name"] = temprow[0];
            row["Vorname"] = temprow[1];
            dsDaten.Tables["Table_Registrierungen"].Rows.Add(row);
        }

Jetzt bastel ich noch eine schöne Schleife, so dass auch alle Datensätze ausgelesen werden, und ich bin fertig. :) Danke an alle!
 

SixDark

Erfahrenes Mitglied
@Jochen Schneider:

Jep, es wäre gut gewesen, wenn ich die Sache mit dem 2.0er Framework gewusst hätte. ;-)
In diesem wurden nämlich zum Vorgänger so ca. 2000 Klassen geändert bzw. hinzugefügt. Da kann es durchaus sein, dass das DataGrid etwas davon abbekommen hat...

Allerdings hab ich die Methode DataBind() noch nie aufrufen müssen?! Ich habe einfach meine Daten in ein DataSet geapckt und dann das DataSet der DataSource Eigenschaft zugewiesen - fertig, schon waren die Daten drin. Hast Du das mal bei diesem - mir ominös vorkommenden - DataGridView ausprobiert? Oder gibt es dann Fehler oder passiert gar nix? würde mich auch mal interessieren, da ich mit dem neuen Framework noch nicht soviel gearbeitet habe - nutze immer noch das 1.1er...

MfG
..::SD::..