Laden...

MySql einfache überprüfun und Abfrage

Erstellt von wolle- vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.551 Views
W
wolle- Themenstarter:in
53 Beiträge seit 2007
vor 16 Jahren
MySql einfache überprüfun und Abfrage

verwendetes Datenbanksystem: Mysql 5.0

Hallo alle zusammen,

nachdem ich mich mehrere Tage bei google und co rumgetrieben habe, habe ich auch hier nochmals sicherlich mehr als 70 Beiträge geweltzt. Ich komme wirklich nicht mehr weiter und bekomme bereits graue haare....

Also zunächst mal zu meiner Situation:

Ich habe eine Login Form und nun schon sicherlich 7 mal neue SQL Statements geschrieben weil ich es einfach nicht hinbekomme - nunendlich dachte ich - Hey die Verbindung steht - sieht auch soweit so aus - jedoch stop:

Hier vorerst mein Code:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;

namespace MyFriends
{
    
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        
        private MyFriends.Forms.MySql Sql = new  MyFriends.Forms.MySql();
        

        private void label4_Click(object sender, EventArgs e)
        {
            string loginconn;
            loginconn = "SELECT id,password FROM 'user' WHERE user='"+ userl.Text +"'";
            MySqlDataReader reader;

            string sUser;
            sUser = userl.Text;
            try
            {
                Sql.Connect();
                MySqlCommand cmd = new MySqlCommand(loginconn);

                if (userl.Text == sUser && passw.Text == reader['password'])
                {

                    MyFriendsHaupt MyFriendsHaupt = new MyFriendsHaupt();
                    MyFriendsHaupt.Show();
                    MyFriendsHaupt.welcome = Convert.ToString(userl.Text);

                    Hide();

                }       
                
              
                
                
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }           

            }


        }

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

Dies ist meine Loginform mit der ich krampfhaft versuche mich zu verbinden - nun folgt meine Klasse mysql:

using System;
using System.Collections.Generic;
using System.Text;
using MySql.Data.MySqlClient;

namespace MyFriends.Forms
{
    class MySql
    {
        public MySql() { }

        private MySqlConnection conn;
        private MySqlDataAdapter da;
        private MySqlCommandBuilder cb;
        private MySqlConnection mysqlcon;
        //private DataTable data;

        /*
         * SQL Server Daten
         */
        private String sql_server = "IP-Adresse"; // Name des SQL Hosts
        private String sql_db = "DB-Name"; // Name der SQL Datenbank
        private String sql_user = "User-Name"; // Anmeldename für die Datenbank
        private String sql_passwd = "Passwort"; // Passwort für die Datenbank
        private String sql_port = "3306";
        private String mySqlConnectionString;




        private string _DbHost;
        public string DbHost
        {
            get { return this._DbHost; }
            set { this._DbHost = value; }
        }

        private string _DbDatabase;
        public string DbDatabase
        {
            get { return this._DbDatabase; }
            set { this._DbDatabase = value; }
        }

        private string _DbUserId;
        public string DbUserId
        {
            get { return this._DbUserId; }
            set { this._DbUserId = value; }
        }

        private string _DbPassword;
        public string DbPassword
        {
            get { return this._DbPassword; }
            set { this._DbPassword = value; }
        }

        public void Connect()
        {
            if (conn != null) conn.Close();

            //  string connStr = String.Format("Server={0}; Database={1}; UserId={2}; Password={3};",
            //    this._DbHost, this._DbDatabase, this._DbUserId, this._DbPassword);
            this.mySqlConnectionString =
                "Server=" + this.sql_server + ";" +
                "Port=" + this.sql_port + ";" +
                "Database=" + this.sql_db + ";" +
                "Uid=" + this.sql_user + ";" +
                "Pwd=" + this.sql_passwd + ";";
            mysqlcon = new MySqlConnection(this.mySqlConnectionString);

            try
            {
                conn = new MySqlConnection(mySqlConnectionString);
                mysqlcon.Open();
            }
            catch (MySqlException ex)
            {
                throw new Exception("Error connecting to the server: " + ex.Message);
            }
        }

        /*public DataTable Query(string Query)
        {
            data = new DataTable();

            if (conn != null)
            {
                da = new MySqlDataAdapter(Query, conn);
                cb = new MySqlCommandBuilder(da);
                da.Fill(data);
            }
        
            return data;
        }*/

        /* public void Update(DataTable incdata)
         {
             DataTable changes = incdata.GetChanges();

             try
             {
                 da.Update(changes);
                 data.AcceptChanges();
             }
             catch
             {
                 throw new Exception("Es wurden keine Änderungen vorgenommen!");
             }
         }
         */
        public void Disconnect()
        {
            if (conn != null) conn.Close();
        }

    }
}

Ich raufe mir die Haare - Alles was ich bekomm ist nichts.
Ich hoffe ihr könnt mir - verstehen - helfen...

  • Was mache ich Grundsätzlich falsch? ?( ?(

Ist es denn nicht möglich einen bzw. mehrere Werte aus der MySql-Db auszulesen und dann in die entsprechenden Variablen zu schreiben in welche sie auch gehören?!

Freue mich schon auf euere Antworten um dort endlich fortfahren zu können 🤔

Vielen Dank für Euere Hilfe - Alles Gute Wolle!

Don`t eat yellow snow 😉

J
3.331 Beiträge seit 2006
vor 16 Jahren

Hallo,

mir fallen folgende Unsauberkeiten und Fehler auf:

Ob der ConnectionString richtig ist, weiß ich nicht. Das kann geprüft werden über ConnectionStrings. Außerdem gibt es die Erleichterung durch **ConnectionStringBuilder **(vermutlich auch bei MySql).

Wo wird der **DataReader **eigentlich benutzt? Siehe Doku-Beispiel:

SqlCommand command = new SqlCommand(queryString, connection);
connection.Open();

SqlDataReader reader = command.ExecuteReader();

// Call Read before accessing data.
while (reader.Read())
{
    Console.WriteLine(String.Format("{0}, {1}", reader[0], reader[1]));
}
// Call Close when done reading.
reader.Close();

Außerdem ist der Standard-Hinweis angebracht: Ein **DbCommand **soll niemals mit seinen Parametern als String verkettet werden; dafür sind **DbParameter **zu verwenden:

DbCommand insert = new DbCommand("...");
insert.Parameters.AddWithValue(...);

Die Gründe wurden schon oft genannt: Klarheit bei Parametern und Datentypen, Vermeiden unnötiger Konvertierungen, Verhindern falscher Konvertierungen, keine SQL-Injection.

Gruß Jürgen

W
wolle- Themenstarter:in
53 Beiträge seit 2007
vor 16 Jahren

Hi du - danke für deine Antwort.
Habe mal versucht deine Hilfe in die Tat umzusetzen.

Schau mal ich kann das einfach nicht verstehen. Wie komme ich an die einzelnen ausgelesenen sachen heran? 😭

Gebe ich user wolle ein soll er mir die ID aus der Datenbank in meine Variable userID schreiben und so weiter.

schaut mal her:

 
        private void label4_Click(object sender, EventArgs e)
        {
           
            string sUser;
            sUser = userl.Text;
            try
            {
                DataSet myData = new DataSet();
                MySql.Data.MySqlClient.MySqlConnection conn;
                MySql.Data.MySqlClient.MySqlCommand cmd;
                MySql.Data.MySqlClient.MySqlDataAdapter myAdapter;
                conn = new MySql.Data.MySqlClient.MySqlConnection();
                cmd = new MySql.Data.MySqlClient.MySqlCommand();
                myAdapter = new MySql.Data.MySqlClient.MySqlDataAdapter();
                conn.ConnectionString = "server=IP;uid=test;" +
                "pwd=test;database=test;";

                try
                {
                  
                    cmd.CommandText = "SELECT password FROM user WHERE user='" + userl.Text + "'";
                    cmd.Connection = conn;

                    myAdapter.SelectCommand = cmd;
                    myAdapter.Fill(myData);
                    MessageBox.Show(myAdapter.ToString());

//                
                }
                catch (MySql.Data.MySqlClient.MySqlException ex)
                {
                    MessageBox.Show(ex.Message, "Report could not be created",MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
                

Liebe Grüße Wolle

Don`t eat yellow snow 😉

W
wolle- Themenstarter:in
53 Beiträge seit 2007
vor 16 Jahren

Habe nochmal komplett umstrukturiert - wie schon 10 mal. X(

Hier das Ergebnis:

        private void label4_Click(object sender, EventArgs e)
        {

            //string sUser;
            //sUser = userl.Text;

			if(isLogin == true)
			{
				MessageBox.Show("You are already logged in from this Computer", "Error: LOGIN error", MessageBoxButtons.OK, MessageBoxIcon.Error);
				return;
			}
            user = userl.Text;
			userName = userl.Text;
			userPass = passw.Text;

            try
            {
				// verbinde zur datenbank
				conn.Open();
                try
                {
					// mysql user query
                    cmd.CommandText = "SELECT * FROM user WHERE user='" + userl.Text + "'";

                    myAdapter.SelectCommand = cmd;
                    myAdapter.Fill(myData);
                    
					MySqlDataReader Reader;
                    Reader = cmd.ExecuteReader();

					

                    while (Reader.Read())
                    {

/*                        string thisrow = "";
                        for (int i = 0; i < Reader.FieldCount; i++)
                            thisrow += Reader.GetValue(i).ToString() + ",";
                        MessageBox.Show(thisrow); */
						for(int i = 0; i < Reader.FieldCount; ++i)
						{


							switch(i)
							{
								case 0:
									userId = Reader.GetValue(i).ToString();
                                    
								break;

								case 1:
									userName = Reader.GetValue(i).ToString();
                                   
								break;

								case 2:
									userPass = Reader.GetValue(i).ToString();
                                    
								break;

								default:
								break;
							}
             	       }
                }
                }// try mysql user query
                catch (MySql.Data.MySqlClient.MySqlException ex)
                {
                    MessageBox.Show(ex.Message, "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

                if (user == userl.Text && userPass == passw.Text)
                {
                    isLogin = true;
                    MessageBox.Show("Succesfully logged in as user >" + userName + "<");

                    MyFriendsHaupt MyFriendsHaupt = new MyFriendsHaupt();
                    MyFriendsHaupt.Show();
                    MyFriendsHaupt.welcome = Convert.ToString(userl.Text);

                    Hide();

                }
                else
                {
                    MessageBox.Show("Dies waren leider falsche Zugangsdaten!", "Falsche Daten", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }

				conn.Close();

            } // try conn.Open();
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            } 

        }

Nun versteh ich nicht - sagen wir user wolle gibt es in der Datenbank mit Passwort test. Gebe ich user wolle mit Passwort hilfe ein - falsches Passwort - gebe ich test ein startet er das Programm. Nun aber was ich nicht verstehe :

Gebe ich irgendwelche Zeichenfolgen ein, welche überhaupt nicht vorhanden sind z.B.:

User: Test
Passwort: Test (gibt es ja garnicht)

Herzlich Willkommen logged in as test....
Ich verstehe es einfach nicht - der guckt doch in der DB nach?! 😜

Vielen Dank und Grüße
Wolle 🤔

Don`t eat yellow snow 😉

F
10.010 Beiträge seit 2004
vor 16 Jahren

Wie wäre es denn, wenn Du überhaupt erst einmal die Grundlagen erliest?

Dein code zeigt, das Du nicht weist was was macht, und du einfach im leeren herumstocherst.

1.
User ist genauso wie Name ein reserviertes Wort, solltest Du also nicht in tabellen benutzen.

2.
Entweder Adapter oder Reader.


DataTable UserTable = new DataTable();
string SelectString = "Select * from 'user' where 'user'=?username";
MySqlDataAdapter myAdapter = new MySqlDataAdapter( SelectString, ConnectionString);
myAdapter.Parameters.AddWithValue("?username", userName);
myAdapter.Fill( UserTable );
if( UserTable.Rows.Count > 0 )
{
  userId =   UserTable.Rows[0][0].ToString();
  userName =   UserTable.Rows[0][1].ToString();
  userPass =   UserTable.Rows[0][2].ToString();
}

J
3.331 Beiträge seit 2006
vor 16 Jahren

Original von wolle-
Herzlich Willkommen logged in as test....
Ich verstehe es einfach nicht - der guckt doch in der DB nach?! 😜

Hier steckt der Fehler:

while (Reader.Read())
{
    for(int i = 0; i < Reader.FieldCount; ++i)
    {
        switch(i) {
            case 0: userId = Reader.GetValue(i).ToString();
                        break;
            case 1: userName = Reader.GetValue(i).ToString();
                        break;
            case 2: userPass = Reader.GetValue(i).ToString();
                        break;
            default: break;
        }
    }
}
if (user == userl.Text && userPass == passw.Text)

Du prüfst überhaupt nicht, ob der DataReader (mindestens) eine Zeile zurückgibt. (Und Du hast die Verbindung zwischen cmd und conn jetzt unter den Tisch fallen lassen.) Die erste Teilbedingung ist immer wahr, weil am Anfang user so festgelegt wird und später nicht mehr geändert wird. Gleiches gilt für die zweite Teilbedingung, wenn kein Datensatz gefunden wird.

Außerdem machst Du es Dir viel zu schwer:

isLogin = false;
while (Reader.Read() && ! isLogin)
{
    isLogin = Reader.GetString(1) == userl.Text 
        && Reader.GetString(2) == passw.Text;
    if (isLogin)
        //  ich nehme an, dass die userId eine Zahl ist, also:
        userId = Reader.GetInt32(0);
}

Gruß Jürgen

PS. FZelle hat mit seinen grundsätzlichen Bedenken recht. Siehe OpenBook Visual C# Kap.26

W
wolle- Themenstarter:in
53 Beiträge seit 2007
vor 16 Jahren

Hallo FZelle,

danke für diese Antwort, da magst du recht haben, jedoch such ich mich ja wie ein Idiot ab weil es nirgends eine richtig saubere Doku gibt. Oder verstehe ich das einfach nur nicht.

Nun mit deinem Code:

myAdapter.Parameters.AddWithValue("?username", userName);

Fehler	1	"MySql.Data.MySqlClient.MySqlDataAdapter" enthält keine Definition für "Parameters".	Form1.cs	82	31	


Den scheint es nicht zu geben und wenn ich nun einen User + Passwort eingebe sagt er mir:

---------------------------
Fehler
---------------------------
Access denied for user 'test'@'127.0.0.1' (using password: NO)
---------------------------
OK   
---------------------------

Das ging jedoch vorher noch?! :S
Hier habe ich jedoch die Zeile die oben steht auskommentiert wegen des Fehlers! 🤔

Grüße Wolle

Don`t eat yellow snow 😉

J
3.331 Beiträge seit 2006
vor 16 Jahren

Original von wolle-
Nun mit deinem Code:

myAdapter.Parameters.AddWithValue("?username", userName);  
  
Fehler	1	"MySql.Data.MySqlClient.MySqlDataAdapter" enthält keine Definition für "Parameters".	Form1.cs	82	31	  
  

Den scheint es nicht zu geben und wenn ich nun einen User + Passwort eingebe sagt er mir:

Dafür gibt es die :rtfm: (FZelle war bei der Korrektur Deines Codes zu schnell.) Dann stellst Du fest, dass **Parameters **nicht zum DataAdapter gehört, sondern zum DbCommand. Und welch Wunder: wenn Du die Links durchklickst, erhältst Du beispielsweise unter **SqlParameterCollection-Klasse **ein schönes Beispiel. Jürgen

F
171 Beiträge seit 2006
vor 16 Jahren

Hallo Wolle,
stimmen deine Einstellungen. Überprüfe das erstmal hier.

Mit dem Konnektor wird auch eine Dokumentation mitgeliefert. Wenn du dich traust dort rumzuklicken, stolperst du zwangsläufig über Beispiele für C# und VB.

Prüfe erstmal, ob du über die Console(mysql) oder wegen mir auch ein GUI auf deinen MySql-Server zugreifen kannst und deine Selects etc. auch so funktionieren. Lokal und Remote für entsprechenden User, NICHT Administrator!

Gruß falangkinjau

W
wolle- Themenstarter:in
53 Beiträge seit 2007
vor 16 Jahren

Huhu - ja das funktionier alles.
Kann mich auch mit dem MySql Browser verbinden und SQL befehle absetzten die User auslesen etc.

Ich durchdenke das ganze nochmals und melde mich dann!! 👍

Don`t eat yellow snow 😉

W
wolle- Themenstarter:in
53 Beiträge seit 2007
vor 16 Jahren

Original von juetho

Original von wolle-
Herzlich Willkommen logged in as test....
Ich verstehe es einfach nicht - der guckt doch in der DB nach?! 😜
Hier steckt der Fehler:

while (Reader.Read())  
{  
    for(int i = 0; i < Reader.FieldCount; ++i)  
    {  
        switch(i) {  
            case 0: userId = Reader.GetValue(i).ToString();  
                        break;  
            case 1: userName = Reader.GetValue(i).ToString();  
                        break;  
            case 2: userPass = Reader.GetValue(i).ToString();  
                        break;  
            default: break;  
        }  
    }  
}  
if (user == userl.Text && userPass == passw.Text)  

Du prüfst überhaupt nicht, ob der DataReader (mindestens) eine Zeile zurückgibt. (Und Du hast die Verbindung zwischen cmd und conn jetzt unter den Tisch fallen lassen.) Die erste Teilbedingung ist immer wahr, weil am Anfang user so festgelegt wird und später nicht mehr geändert wird. Gleiches gilt für die zweite Teilbedingung, wenn kein Datensatz gefunden wird.

Außerdem machst Du es Dir viel zu schwer:

isLogin = false;  
while (Reader.Read() && ! isLogin)  
{  
    isLogin = Reader.GetString(1) == userl.Text   
        && Reader.GetString(2) == passw.Text;  
    if (isLogin)  
        //  ich nehme an, dass die userId eine Zahl ist, also:  
        userId = Reader.GetInt32(0);  
}  

Gruß Jürgen

PS. FZelle hat mit seinen grundsätzlichen Bedenken recht. Siehe
>

Hallo habe es germacht wie von juetho beschrieben,

nun bekomme ich die Meldung, hatte ich gestern schonmal aber kann mich nicht erinnern:

---------------------------

---------------------------
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
---------------------------
OK   
---------------------------

Grüße Wolle 🤔

Don`t eat yellow snow 😉

F
10.010 Beiträge seit 2004
vor 16 Jahren

war wirklich zu schnell:


myAdapter.SelectCommand.Parameters.AddWithValue("?username", userName);

Und es ist eine ziemliche Frechheit zu behaupten, das das nicht dokumentiert ist.
Das von Jürgen angegebene Kapitel im OpenBook ist mal eine Einführung.
Dann enthält die Doku zum MySqlConnector.NET haufenweise Beispiele.

Bei MSDN gibt es weitere Beispiele, auf MSDN-Solve und,und,und.

Und dieses Forum ist auch voll mit beispielen.

J
3.331 Beiträge seit 2006
vor 16 Jahren

Original von wolle-
Hallo habe es germacht wie von juetho beschrieben,

nun bekomme ich die Meldung, hatte ich gestern schonmal aber kann mich nicht erinnern:

---------------------------  
  
---------------------------  
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.  
---------------------------  
OK     
---------------------------  
  

Grüße Wolle 🤔

Diese Meldung kommt immer wieder, wenn man nicht korrekt arbeitet. Sie hat es deshalb schon längst in die [FAQ] NullReferenceException: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt geschafft und ist hervorragend dafür geeignet, [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

Jürgen

PS. Du kannst nicht erwarten, dass ein Helfer Code-Schnipsel exakt für Deine Problemstellung testet und nur korrekter Code im Forum landet. Ich bemühe mich beispielsweise, am bestehenden Code möglichst wenig zu ändern; dadurch können Fehler entstehen. Aber Du sollst/willst ja schließlich lernen, und dabei helfen Fehler.

PS2. Und es ist natürlich sehr unfreundlich von Dir, uns eine solche Fehlermeldung hinzuknallen, ohne per Debugger zu prüfen, an welcher Stelle der Fehler auftritt, und uns diesen Code-Ausschnitt anzugeben.

W
wolle- Themenstarter:in
53 Beiträge seit 2007
vor 16 Jahren

Hallo Ihr beiden,

bin euch sehr dankbar, dass ihr mir geholfen habt - aber jetzt fühlt euch mal bitte nicht angepisst. Habe nicht darum gebeten, dass ihr mir das fertig coded und ich habe wirklich 2 tage am stück gesucht und gefummelt bevor ich hier überhaupt getraut habe zu fragen. 😜

Also ich fummel mich da jetzt durch mit der Hilfe die ihr mir gegeben habt, bin auch dankbar darum - aber fühlt euch bitte nicht direkt ans bein gepinktelt - so war das überhaupt garnicht gemeint! 🤔

Entschuldigt 🙂

Liebe Grüße Wolle 🙂

PS zurück:

Und es ist eine ziemliche Frechheit zu behaupten, das das nicht dokumentiert ist.
Das von Jürgen angegebene Kapitel im OpenBook ist mal eine Einführung.
Dann enthält die Doku zum MySqlConnector.NET haufenweise Beispiele.

Bei MSDN gibt es weitere Beispiele, auf MSDN-Solve und,und,und.

Und dieses Forum ist auch voll mit beispielen.

Auch du - bitte rege dich ab, so habe ich es ebenfalls nicht gemeint. Es ist nicht einfach im internet eine Komplette doku zufinden die auch verständlich (für dich bestimmt - aber für micht evtl. nicht) ist. Habe daher doch den code so oft umgebaut weil ich soviele Anleitungen probiert habe. Finde es eine Frechheit - dass direkt mit solchen tönen gespuckt wird. Schade eigentlich.
Ist auf jeden Fall nicht böse gemeint - lasst euch dies gesagt sein !!!

LG Wolle 😉

Don`t eat yellow snow 😉

F
10.010 Beiträge seit 2004
vor 16 Jahren

Du hast damit angefangen.

W
wolle- Themenstarter:in
53 Beiträge seit 2007
vor 16 Jahren

Hehe FZelle - der hat gesessen 😉
Ich wollte nicht das es so ankommt und damit lass doch wieder gut sein, ich tüftel mich jetzt erstmal nochmal durch die Dokus - habe ja einen anfang :- )

👍

Don`t eat yellow snow 😉