Autor Beitrag
Silvernils
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Di 03.03.09 19:43 
Also vorab muss ich sagen, dass ich von dem ganzen Zeug noch nicht so viel Ahnung habe.
Ich bin momentan auf der FOS und wir haben gerade ein Projekt am laufen, wo wir mittels XAMPP eine Sql-DB erstellen. Jetzt hat unser Lehrer uns einen Quellcode gegeben, der die DB einbindet. Da habe ich jetzt das Problem, dass ich nicht die nötige Ahnung habe, um festzustellen, wo das Problem genau liegt.
Den Fehler kann ich nicht genau schildern, ich hab einfach die Hoffnung, dass hier jemand den nötigen Durchblick hat und mir sagen kann, was genau ich auf mein System speziell umschreiben muss, damit es funktioniert.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using MySql.Data.MySqlClient;//GIbT'S BEI WWW.MYSQL.COM


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private MySqlConnection conn;
        private DataTable data;
        private MySqlDataAdapter da;
        private MySqlCommandBuilder cb;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (conn != null)
                conn.Close();

            string connStr = String.Format("server={0};user id={1}; password={2}; database=mysql; pooling=false",
                textBox1.Text, textBox2.Text, textBox3.Text);

            try
            {
                conn = new MySqlConnection(connStr);
                conn.Open();
                label7.BackColor = Color.Lime;
                label7.ForeColor = Color.Lime;
                GetDatabases();
            }
            catch (MySqlException ex)
            {
                MessageBox.Show("Error connecting to the server: " + ex.Message);
            }
 
        }

        private void GetDatabases()
        {
            MySqlDataReader reader = null;

            MySqlCommand cmd = new MySqlCommand("SHOW DATABASES", conn);
            try
            {
                reader = cmd.ExecuteReader();
                comboBox1.Items.Clear();
                while (reader.Read())
                {
                    comboBox1.Items.Add(reader.GetString(0));
                }
            }
            catch (MySqlException ex)
            {
                MessageBox.Show("Failed to populate database list: " + ex.Message);
            }
            finally
            {
                if (reader != null) reader.Close();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            conn.Close();
            label7.BackColor = Color.Red;
            label7.ForeColor = Color.Red;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            if (conn != null)
                conn.Close();

            Application.Exit(); // Ende des Zugriffs auf die Datenbank
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            MySqlDataReader reader = null;

            conn.ChangeDatabase(comboBox1.SelectedItem.ToString());

            MySqlCommand cmd = new MySqlCommand("SHOW TABLES", conn);
            try
            {
                reader = cmd.ExecuteReader();
                comboBox2.Items.Clear();
                while (reader.Read())
                {
                    comboBox2.Items.Add(reader.GetString(0));
                }
            }
            catch (MySqlException ex)
            {
                MessageBox.Show("Failed to populate table list: " + ex.Message);
            }
            finally
            {
                if (reader != null) reader.Close();
            }
        }

        private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
        {
            data = new DataTable();

            da = new MySqlDataAdapter("SELECT * FROM " + comboBox2.SelectedItem.ToString(), conn);
            cb = new MySqlCommandBuilder(da);

            da.Fill(data);

            dataGridView1.DataSource = data;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            conn.ChangeDatabase(comboBox1.SelectedItem.ToString());
            //DB festlegen
            data = new DataTable();//Hintergrundarray erzeugen

            da = new MySqlDataAdapter(textBox4.Text, conn);
            cb = new MySqlCommandBuilder(da);
            da.Fill(data);

            da = new MySqlDataAdapter("SELECT * FROM " + comboBox2.SelectedItem.ToString(), conn);
            cb = new MySqlCommandBuilder(da);
            da.Fill(data);//ausführen
            dataGridView1.DataSource = data;//anzeigen
        }
    }
}


Moderiert von user profile iconKha: Quote- durch C#-Tags ersetzt
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 03.03.09 20:18 
Hallo und :welcome:

tut mir leid, aber so geht das nicht.

Erstens (nur der Höflichkeit halber) solltest Du den Code-Auszug als solchen markieren: Unter "Bereiche" nicht "Zitat" auswählen, sondern C# und den Plus-Button. Das liest sich erheblich besser und macht eher Freude zum Antworten.

Zur Sache: Unter NET werden DbConnection und (soweit erforderlich) DbDataAdapter nur kurzfristig erzeugt und benutzt und nach Erledigung wieder geschlossen. Damit das nicht vergessen wird, geht ein typischer Ablauf so:

DataSet ds und ggf. DataTable gehören fest zum Formular oder (noch besser) in eine eigene Klasse. Durch einen Button werden Daten abgeholt, z.B.:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
string myConnectionString = "...";
using(DbConnection conn = new DbConnection(myConnectionString)) {
   using(DbDataAdapter da = new DbDataAdapter()) {
      da.Connection = conn;
      DbCommand cmd = new DbCommand("SELECT * FROM Customers WHERE Cust_ID BETWEEN @Start AND @Ende");
      cmd.Parameters.AddWithValue("@Start"83);
      cmd.Parameters.AddWithValue("@Ende"114);
      da.SelectCommand = cmd;
      try {
          da.Fill(ds, "Customers");
      } catch(Exception ex) {
          MessageBox.Show(ex.ToString());
      }
   }
}

Bei diesem Verfahren werden DbConnection und DbDataAdapter nach Erledigung automatisch aufgelöst; auch conn.Open/Close sind nicht nötig. Für die Verbindung comm/da/cmd gibt es je nach DB-System verschiedene Alternativen.

Einige weitere Hinweise:

Eine Einführung gibt es in OpenBook VC# Kap.25 ff.. Dort werden Sql-Klassen benutzt für den MS-SQL Server; ich benutze als allgemeine Angabe Db-Klassen, Ihr benötigt MySql-Klassen. Aber alles geht weitgehend gleich. Eine Kurzfassung ist zu finden unter Datenbanken How-To.

Zur Verwendung der DbConnection siehe [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen, zur Verwendung von Parametern siehe SQL-Befehle mit Parametern.

Wozu die Button-Clicks gedacht sind und wie alles zusammenarbeiten soll, kann und will ich nicht untersuchen. Zum einen ist der Code so nicht lesbar, dann fehlen zum Verständnis für "Fremde" viele, viele Kommentare, schließlich läuft offensichtlich einiges falsch ab. Du musst schon noch etwas mehr Vorarbeiten leisten, bevor ich Dir eine ausführlichere Antwort geben kann.

Gruß Jürgen