Die GUI einer Windows Form Application aus einr MySql Datenbank befüllen

krokev

Mitglied
des sollte eine eingabemaske werden mit drei verschieden eingabe kategorien und je nach auswahl im dropdown sollten verschiedene felder nachgeladen werden

derzeit scheitert es daran die spaltennamen MYSQL in der gui auszugeben bzw sie in kategorien zu gliedern und angschliessend auszugeben
 
V

VScan

Hey,

eine konkretere Problembeschreibung wäre schon ganz gut!

Woran genau scheitert es denn?
An der MySql-Connection, am Zugriff auf die Spalten, bei der Gliederung der Daten, bei der Datenausgabe?

Normalerweise werden die Codeabschnitte gepostet, bei denen man ein Problem hat!


Zusätzlich würde ich empfehlen, dass Du Dir folgende Seite rein ziehst, denn der Code, wie er bei Dir im ersten Schnippsel zu sehen ist, ist bei der Fehlerbeseitigung nicht sehr hilfreich:

C#:
catch (Exception)
            {
                return null;
            }


stattdessen sollte da mindestens folgendes stehen:


C#:
catch (Exception e)
            {
                Console.WriteLine("Error while trying to connect to database: " + e.Message() + "\r\n
                                   Stacktrace: " + e.StackTrace());
                return null;
            }

Hier die Seite für das Exception-Handling:

http://msdn.microsoft.com/de-de/library/s7fekhdy(v=VS.100).aspx


Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:

krokev

Mitglied
cool danke für den einwand

mysql connection ist erfolgreich, zugriff auf die spalten sollte nicht das problem sein
die datenausgabe macht allerdins nach wie vor probleme
wie bekomme ich zb diesen select befehl in ein label so das er direkt beim aufruf des programms befühlt wird

SELECT visitor_database.last_name
FROM visitation CROSS JOIN
visitor_database
 
V

VScan

Bei Deiner Form, gibt es bei den Ereignissen, das Form_Load-Event, hier kann man code platzieren, der beim Laden der Form ausgeführt werden soll.

Hierzu markiert man die Form per Mausklick und klickt im Eigenschaftenfenster auf das Blitzsymbol (Ereignisse), hier findet man nun das Form_Load event, das lediglich doppelt geklickt werden muss, um das Ereignis zu verknüpfen.

Ich denke Du meinst das Ergebnis des "selects", das Du in einem Label haben willst!?

Wenn ja, sollte es ungefähr so aussehen:

C#:
private void Form1_Load(object sender, EventArgs e)
        {
            String mySqlCmd = "SELECT visitor_database.last_name
FROM visitation CROSS JOIN
visitor_database ";
            String connectionString = "SERVER=;dautsql01" +
                            "DATABASE=Visitis.dbo";
            DataAccess.SetConString("") // <- INFO: Deine Methode ausbessern, die setzt immer den gleichen ConnectionString
            DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd);


            // sonstiger code (z.B. schreibst Du hier dann das ergebnis in ein Label)
        }


Kennst Du die Klasse DataGridView? Wenn nein, würde ich mir diese mal angucken, damit lassen sich die Daten in einfachster form präsentieren, ohne viel Programmieraufwand:

http://www.dotnetperls.com/datagridview-tutorial
 
Zuletzt bearbeitet von einem Moderator:

krokev

Mitglied
okay danke das mySQLCmd muss ich aber noch aufrufen damit es ausgegeben wird oder? wie schaut so ein aufruf in einenem label aus?
nach dem aufruf sollte auch diese fehlermeldung verschwinden oder?
String connectionString = "SERVER=;dautsql01" + "DATABASE=Visitis.dbo";
die Variable Connectionstring is zugewiesen ihr wert wird aber nie verwendet

und bezüglich SetConString da sollte doch immer der gleiche connectionstring aufgerufen werden oder nicht?

meine aktueller code in der textbox:
C#:
          private void richTextBox1_TextChanged(object sender, EventArgs e)
                      {
            String mySqlCmd = "SELECT visitor_database.last_name FROM visitation CROSS JOIN visitor_database ";
            String connectionString = "SERVER=dautsql01; DATABASE=Visitors.dbo";
            DataAccess.SetConString(connectionString);
            DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd);
            Console.WriteLine(mySqlCmd);
                      }

der string mySqlCmd wird nur als text ausgegeben allerdings nicht die daten der datenbank was is hierbei faul? 
bzw ist etwas mit meiner data_accessklasse faul****

 public static void SetConString(string conString)
        {
            connectionString = "SERVER=dautsql02; DATABASE=Visitors.dbo";
        }

public static DataTable ExecuteQuery(string sql)
        {
           
            try
            {
                SqlConnection connection = new SqlConnection(connectionString);
                SqlDataAdapter SQLAdapter = new SqlDataAdapter(sql, connection);
                SqlCommandBuilder commandbuilder = new SqlCommandBuilder(SQLAdapter);
                DataTable ds = new DataTable();
                connection.Open();
                SQLAdapter.Fill(ds);
                connection.Close();
                return ds;
            }

            catch (Exception e)
            {
                Console.WriteLine("Error while trying to connect to database: ");
                return null;
            }    
        }

 public static int ExecuteNonQuery(string sql)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            connection.ConnectionString = connectionString;
            try
            {
                connection.Open();
                SqlCommand command = new SqlCommand(sql, connection);
                return command.ExecuteNonQuery();
            }
            catch (Exception)
            {
                return -1;
            }
            finally
            {
                connection.Close();
            }

        }

public static bool HasRecords(DataTable datatable)
        {
            return datatable != null && datatable.Rows.Count > 0 ? true : false;
        }

edit:
C#:
public void button1_Click(object sender, EventArgs e)
        {
            
            String mySqlCmd = "SELECT visitor_database.last_name FROM visitation CROSS JOIN visitor_database ";
            String connectionString = "SERVER=;dautsql01" + "DATABASE=Visitis.dbo";
            DataAccess.SetConString("");
            DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd); 
            MessageBox.Show(mySqlCmd);
        }
hab das in einen button verpackt und hab aber momentan das er mit einen error bringt

in der klasse data_access:
C#:
SqlConnection connection = new SqlConnection(connectionString);
Fehlermeldung:
ArgumntExeption wurde nicht behandelt
Keyword not supported #dautsql01database#

Woran liegt das? bzw was muss geändert werden um diesen Fehler zu vermeiden.

edit2:
Bin Programmieranfänger und habe momentan ein Problem meine Daten aus der Datenbank in einer Textbox auszugeben
Dabei gibt es konkret folgende zwei Probleme:
1. Die Datenbankverbindung sollte hergestellt werden und überprüft werden allerdings bekomme ich keine Fehlermeldung wen ich eine Falsche Datenbank eintrage somit kann etwas mit meiner Dataaccessklasse nicht in Ordnung sein/der Aufruf dieser Metoden macht Probleme.
Meine Dataaccessklasse:
C#:
class DataAccess
    {
        public static string connectionString;

public static void SetConString(string conString)
        {
            connectionString = "SERVER=dautsql02; DATABASE=Visitors.dbo";
        }
 public static DataTable ExecuteQuery(string sql)
        {
            try
            {
                SqlConnection connection = new SqlConnection(connectionString);
                SqlDataAdapter SQLAdapter = new SqlDataAdapter(sql, connection);
                SqlCommandBuilder commandbuilder = new SqlCommandBuilder(SQLAdapter);
                DataTable ds = new DataTable();
                connection.Open();
                SQLAdapter.Fill(ds);
                connection.Close();
                return ds;
            }

            catch (Exception e)
            {
                Console.WriteLine("Error while trying to connect to database: ");
                return null;
            }    
        }

 public static int ExecuteNonQuery(string sql)
        {
            SqlConnection connection = new SqlConnection(connectionString);
            connection.ConnectionString = connectionString;
            try
            {
                connection.Open();
                SqlCommand command = new SqlCommand(sql, connection);
                return command.ExecuteNonQuery();
            }
            catch (Exception)
            {
                return -1;
            }
            finally
            {
                connection.Close();
            }

        }

  public static bool HasRecords(DataTable datatable)
        {
            return datatable != null && datatable.Rows.Count > 0 ? true : false;
        }
Der Aufruf der Funktionen:
C#:
public void Form1_Load_1(object sender, EventArgs e)
           {
            DataAccess.SetConString(string conString);  
            DataAccess.ExecuteNonQuery(string sql);
            DataAccess.ExecuteQuery(string sql);
            DataAccess.HasRecords(DataTable datatable);
}

Mein Versuch die Daten in einer Textbox auszugeben:
C#:
private void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            String mySqlCmd = "SELECT visitor_database.last_name FROM visitation CROSS JOIN visitor_database ";
            String connectionString = "SERVER=dautsql01; DATABASE=Visitors.dbo";
            DataAccess.SetConString(connectionString);
            DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd);
            Console.WriteLine(mySqlCmd);
        }

Ich hoffe sehr das mit jemand weiterhelfen kann

LG KROKEV
 
Zuletzt bearbeitet von einem Moderator:

sheel

I love Asm
(!) Krokev, halte dich bitte an die Regen hier.
VScan kann sich auch nicht 24h um dich kümmern.

  • Keine Mehrfachposts hintereinander
  • Nicht mehrere gleiche Themen
  • Richtigen Forumsbereich wählen (C# gehört zu .NET)
  • Codetags benutzen, nicht Quote
  • Richtige Codetags benutzen (siehe Signatur)
  • Keine Profilnachrichten oder PNs, um nach Hilfe zu betteln
  • Deutsch
Danke

Gruß
 

krokev

Mitglied
okay sorry tut mir leid hab mir nichts dabei gedacht und gehofft das ich so schneller hilft bei meinem problem bekommen

Sorry
 
V

VScan

Hey, kein Problem, war noch beim Arbeiten :)


okay danke das mySQLCmd muss ich aber noch aufrufen damit es ausgegeben wird oder?

So führst Du die Abfrage aus:

C#:
DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd);


nach dem aufruf sollte auch diese fehlermeldung verschwinden oder?
String connectionString = "SERVER=;dautsql01" + "DATABASE=Visitis.dbo";
die Variable Connectionstring is zugewiesen ihr wert wird aber nie verwendet

Der Compiler meckert deswegen, weil Du innerhalb der Methode SetConString(string conString) die Variable conString nicht zuweist, sollte dann so aussehen:

C#:
         public static void SetConString(string conString)
        {
            connectionString = conString;
        }


Danach rufst Du erst die Methode SetConString auf, bevor Du die Abfrage aufrufst, ungefär so:

C#:
         DataAccess.SetConString("SERVER=dautsql02; DATABASE=Visitors.dbo;");
         // Dann weiterer code...
         DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd);


Fehlermeldung:
ArgumntExeption wurde nicht behandelt
Keyword not supported #dautsql01database#

Das Problem ist der ConnectionString, der eigentlich (zumindest kenn ich es nicht anders) folgendermaßen aussehen sollte bei einer MySql-Datenbank:

C#:
string myConnectionString = "SERVER=localhost;" +
                            "DATABASE=mydatabase;" +
                            "UID=user;" +
                            "PASSWORD=mypassword;";


Es gibt immer kleine Variationsmöglichkeiten bei Datenbanken, das heisst es sind durchaus andere Muster/Parameter im ConnectionString möglich, auch zusätzliche Parameter, wobei Du Dir vielleicht folgende Seite ansehen solltest:

http://dev.mysql.com/doc/refman/5.6/en/connector-net-tutorials-intro.html


Viele Grüße
 
Zuletzt bearbeitet von einem Moderator:

krokev

Mitglied
Sollte das nicht eigentlich auch so funktionieren?
Code:
 public void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            String mySqlCmd = "SELECT visitor_database.last_name FROM visitation CROSS JOIN visitor_database ";
            String connectionString = "SERVER=dautsql01; DATABASE=Visitors.dbo";
            DataAccess.SetConString(connectionString);
            DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd);
            Console.WriteLine(mySqlCmd);
        }

Meine derzeitige Form Klasse:
Code:
namespace visitor_management_2011
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
            this.Load += new EventHandler(Form1_Load_1);
        }

        private void stripmenu_filtern_Click(object sender, EventArgs e)
        {
        }


        public void Form1_Load_1(object sender, EventArgs e)
           {
           /*
            DataAccess.SetConString(string conString);  
            DataAccess.ExecuteNonQuery(string sql);
            DataAccess.ExecuteQuery(string sql);
            DataAccess.HasRecords(DataTable datatable);
             */ gehört das da rein****?
               
            }


        public void button1_Click(object sender, EventArgs e)
        {
        }

        public void richTextBox1_TextChanged(object sender, EventArgs e)
        {
            String mySqlCmd = "SELECT visitor_database.last_name FROM visitation CROSS JOIN visitor_database ";
            String connectionString = "SERVER=dautsql01; DATABASE=Visitors.dbo";
            DataAccess.SetConString(connectionString);
            DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd);
            Console.WriteLine(mySqlCmd);
        }
 
Zuletzt bearbeitet:
V

VScan

Klar funktioniert das, aber sehr schön ist das nicht gerade!

Stell Dir vor, dass bei jeder Texteingabe, die Du machst, die Abfrage ausgeführt wird, sehr effektiv ist das nicht, aber zu Testzwecken :)

Schau Dir mal folgendes an:

C#:
public void button1_Click(object sender, EventArgs e)
{
     fillMyRichTextBox();
}

private void fillMyRichTextBox()
{
     String mySqlCmd = "SELECT visitor_database.last_name FROM visitation CROSS JOIN visitor_database ";
     String connectionString = "SERVER=dautsql01; DATABASE=Visitors.dbo";
     DataAccess.SetConString(connectionString);
     DataTable dataTable = DataAccess.ExecuteQuery(mySqlCmd);

     if(dataTable != null)
     {
          for(int index = 0; index < dataTable.Rows.Count; index++)
          {
                addTextToRichTextBox(dataTable.Rows[index]["last_name"].ToString());
          }
     }
}


private void addTextToRichTextBox(String text)
{
     RichTextBox1.Text = text + "\r\n" +  RichTextBox1.Text; // \r\n für eine neue Zeile
}
 
Zuletzt bearbeitet von einem Moderator: