Autor Beitrag
Kenpachi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30

Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
BeitragVerfasst: Mo 30.11.09 22:08 
Moin moin.

Eines vor weg. Ich bin was Programmierung angeht noch total unbeleckt, also bitte erschlagt mich nicht, wenn ich einen falschen Ausdruck benutze, oder Noob-Code präsentiere. ;)

Ich möchte, dass mein Programm beim klicken auf einen Button versucht zu einer MySQL-Datenbank zu verbinden, was an sich ja kein großes Problem darstellen sollte.
Also, mein Problem liegt darin, dass das Verbinden immer wieder - aus mir nicht verständlichen Gründen - fehlschlägt.

Hier mal meine Klasse:
ausblenden volle Höhe 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:
using MySql.Data;
using MySql.Data.MySqlClient;
using MySql.Data.MySqlClient.Properties;
using MySql.Data.Types;
using MySql.Web;
using MySql.Web.Common;
using MySql.Web.Profile;
using MySql.Web.Properties;
using MySql.Web.Security;
using MySql.Web.SessionState;
using System.Data.SqlClient;
using System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace ItemEditorCreator
{
    public class ClassSqlConnection
    {
        private static SqlConnection MySqlConnection = new SqlConnection();

        private static void TryConnect()
        {
            MySqlConnection.ConnectionString = "SERVER=127.0.0.1,-1;UID=ragnarok;PASSWORD=ragnarok;DATABASE=server;";

            try
            {
                MySqlConnection.Open();

                if (MySqlConnection.State == ConnectionState.Open)
                {
                    MessageBox.Show("Verbindung hergestellt");
                }
            }
            catch(SqlException e)
            {
                MessageBox.Show(e.Message);
            }
        }

        private void Connection_Close()
        {
            MySqlConnection.Close();
        }

        public void ConnectSql()
        {
            TryConnect();
        }

        public void CloseSql()
        {
            Connection_Close();
        }
    }
}


Ich habe erst mal alle möglichen MySql Namespaces reingeladen, weil ich absolut keinen Schimmer habe, welchen ich nun wirklich brauchen könnte, außer System.Data.SqlClient...

Also, mein SQL-Benutzer heißt wirklich 'ragnarok', das Passwort ist auch 'ragnarok' und er darf von jedem Host zugreifen.
Die Datenbank heißt auch wirklich 'server' und liegt auch lokal auf meinem Rechner.
Als SQL-Server nutze ich XAMPP, falls das wichtig ist.

Wie sieht denn nun der Fehler aus?
Ja, im Grunde gibt es nun mehrere Sachen - alle bezogen auf den ConnectionString - die ich merkwürdig finde.

Sieht der ConnectionString so aus:
"SERVER=127.0.0.1;PORT=3306;UID=ragnarok;PASSWORD=ragnarok;DATABASE=server;"
Dann sagt mir die IDE (Visual Studio 2008 Express): "Schlüsselwort wird nicht unterstützt: 'port'."
Das verwirrt mich am meisten, da diese Meldung bei einem Bekannten auf'm Rechner nicht kommt und ohne Probleme verbunden wird.

Nun bin ich ja nicht komplett blöd und befrage Google mal ein wenig zum ConnectionString und finde heraus, dass man den Port auch direkt bei der Adresse mit angeben kann. Gelesen, getan... ConnectionString sieht nun so aus:
"SERVER=127.0.0.1,3306;UID=ragnarok;PASSWORD=ragnarok;DATABASE=server;"
Jetzt sagt die IDE: "Nicht negative Zahl erforderlich. Parametername: count"

Hmm. Naja, lass ich den Port halt weg, denn standartmäßig sollte ja eh versucht werden, auf 3306 zu verbinden:
"SERVER=127.0.0.1;UID=ragnarok;PASSWORD=ragnarok;DATABASE=server;"
Oha, jetzt gibts sogar schon eine SqlException: "provider: Named Pipes-Provider, error: 40" (gekürzt)

Von dieser 'Ausnahme' hatte ich bei meinen Google-Recherchen auch schon gelsen, also hab ich meinen ConnectionString folgendermaßen angepasst:
"SERVER=127.0.0.1,-1;UID=ragnarok;PASSWORD=ragnarok;DATABASE=server;"
Nun bekomme ich als SqlException ausgespuckt, dass der Zielcomputer die Verbindung verweigerte und bin mit meinem Latein am Ende.

Ich hoffe, dass ihr mir da weiterhelfen könnt. :)


MfG Kenpachi
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 30.11.09 22:15 
:welcome:

System.Data.SqlClient enthält den Provider für Microsofts SQL Server, versuch es lieber mal mit MySqlConnection, ... ;) .

_________________
>λ=
Kenpachi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30

Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
BeitragVerfasst: Mo 30.11.09 22:25 
Ja, was soll ich da noch sagen?
Danke! :D

So simpel kann es manchmal sein... Und ich such mir zwei Tage den Ar*** ab...

Aus:private static SqlConnection MySqlConnection = new SqlConnection();

Mach:private static MySqlConnection MySqlConnection = new MySqlConnection();
Und siehe da, es geht. :)


MfG Kenpachi
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 01.12.09 10:46 
Hallo und ebenfalls :welcome:

Sebastians Antwort möchte ich noch ein wenig erweitern, um dein Verständnis zu verbessern.

Jeder DbProvider steuert die Zusammenarbeit mit "seinem" DBMS. Sql-Klassen aus SqlClient für MS-SQL, MySql-Klassen aus MySqlClient für MySql usw. Schon das "System.Data.SqlClient" weist auf einen "Missbrauch" hin. "System.Data.SqlClient" kannst du überhaupt nicht gebrauchen.

Die folgende Zeile beweist fehlendes Verständnis für die Zusammenarbeit von Klassen und Objekten (OK, du bist Anfänger):
Zitat:
ausblenden C#-Quelltext
1:
private static SqlConnection MySqlConnection = new SqlConnection();					

MySqlConnection ist der Name einer Klasse, du verwendest es als Name einer Variablen. (Dazwischen musst du genau unterscheiden.) Das bringt jeden Leser durcheinander, zumal "MySql" zu einem ganz anderen Namespace gehört als "Sql". Der Compiler kann wider Erwarten damit leben, weil er das über den Gültigkeitsbereich von Variablen steuern kann.

Der ConnectionString muss natürlich zu MySql passen. Einzelheiten sind zu finden unter ConnectionStrings/mysql. Dazu gibt es mehrere mögliche MySqlProvider (siehe dort). Du musst dich für einen entscheiden, diesen installieren (das beschränkt sich auf einige DLLs) und ausschließlich dessen DLLs per Referenz und using einbinden.

Zur Einführung in ADO.NET siehe z.B. OpenBook Visual C# Kap.25 ff. Achtung: Es hat seinen Sinn, dass das erst so spät kommt; es handelt sich um ein sehr komplexes Thema, das für Anfänger kaum geeignet ist! Wenn du dich damit beschäftigst, musst du alle Sql-Klassen durch deine MySql-Klassen ersetzen; auch darfst du dich nicht über einzelne Fehlermeldungen wundern, weil MS-SQL eben etwas anders arbeitet als MySql. Siehe dazu z.B. Wikibooks: Einführung in SQL

Dein Verfahren mit einer ClassSqlConnection-Klasse und static-Methoden ist ziemlich unpraktisch. Vergiss es am besten schnell wieder. Ein Mini-Beispiel für ein sinnvolles Verfahren habe ich unter Insert ? Ado.net c# (erste Antwort) gebracht.

Für MySql kannst du nicht den Designer von VSC Express verwenden; der unterstützt nur MS-Produkte. Das halte ich aber für einen Vorteil; dann hast du immer die Kontrolle darüber, was passiert, und kannst nicht von der Arbeit des TableAdapters im Hintergrund verwirrt werden.

Siehe zusätzlich NET Richtlinien für Namen: Groß- und Kleinschreibung bei Klassen und Variablen, kein "Class" bei Klassen usw.

Ich hoffe, dass ich dich entmutigt habe. Viel Erfolg! Jürgen

PS. Solange die Datenbank lokal liegt, funktioniert das. Wenn sie auf einem Internet-Provider liegt, kannst du in der Regel nicht direkt darauf zugreifen, sondern nur soweit, wie er es zulässt; dazu habe ich aber überhaupt keine Ahnung.
Kenpachi Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 30

Win Vista, Win 7
C#, VB, ASP.NET (VS 2010 Express)
BeitragVerfasst: Do 03.12.09 00:02 
Hallo Jürgen.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
Hallo und ebenfalls :welcome:

Sebastians Antwort möchte ich noch ein wenig erweitern, um dein Verständnis zu verbessern.

Jeder DbProvider steuert die Zusammenarbeit mit "seinem" DBMS. Sql-Klassen aus SqlClient für MS-SQL, MySql-Klassen aus MySqlClient für MySql usw. Schon das "System.Data.SqlClient" weist auf einen "Missbrauch" hin. "System.Data.SqlClient" kannst du überhaupt nicht gebrauchen.

Genau das wurde mir durch Kha's Antwort bewusst. Ich wusste halt nicht, dass es für MySQL einen eigenen Namespace gibtund da ich bis zu diesem Zeitpunkt ja noch SqlConnection nutzte, war der Namespace System.Data.SqlClient halt auch nötig.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Die folgende Zeile beweist fehlendes Verständnis für die Zusammenarbeit von Klassen und Objekten (OK, du bist Anfänger):
Zitat:
ausblenden C#-Quelltext
1:
private static SqlConnection MySqlConnection = new SqlConnection();					
MySqlConnection ist der Name einer Klasse, du verwendest es als Name einer Variablen. (Dazwischen musst du genau unterscheiden.) Das bringt jeden Leser durcheinander, zumal "MySql" zu einem ganz anderen Namespace gehört als "Sql". Der Compiler kann wider Erwarten damit leben, weil er das über den Gültigkeitsbereich von Variablen steuern kann.
Naja, mir ist schon klar, dass ich den Klassennamen auch als Namen für die Variable benutze. Da es aber keine Probleme verursacht, spielte das an dieser Stelle für mich keine Rolle, denn zum einen hilft Intellisense mir beim Unterscheiden und zum zweiten sieht - in der Regel - niemand meinen Code, außer mir. Ich hätte vielleicht "My_SqlConnection" nehmen sollen, um es direkt unterscheiden zu können, aber wie gesagt... Es spielte an dieser Stelle keine Rolle für mich.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Der ConnectionString muss natürlich zu MySql passen. Einzelheiten sind zu finden unter ConnectionStrings/mysql. Dazu gibt es mehrere mögliche MySqlProvider (siehe dort). Du musst dich für einen entscheiden, diesen installieren (das beschränkt sich auf einige DLLs) und ausschließlich dessen DLLs per Referenz und using einbinden.
Die Seite hatte mir die beiden Tage zuvor schon viele Informationen vermittelt, aber trotzdem vielen Dank. Das MySql Pack habe mich mir auch gleich im Anschluss an Kha's Posting besorgt, installiert und auch referenziert.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Zur Einführung in ADO.NET siehe z.B. OpenBook Visual C# Kap.25 ff. Achtung: Es hat seinen Sinn, dass das erst so spät kommt; es handelt sich um ein sehr komplexes Thema, das für Anfänger kaum geeignet ist! Wenn du dich damit beschäftigst, musst du alle Sql-Klassen durch deine MySql-Klassen ersetzen; auch darfst du dich nicht über einzelne Fehlermeldungen wundern, weil MS-SQL eben etwas anders arbeitet als MySql. Siehe dazu z.B. Wikibooks: Einführung in SQL
Hab beide Links schon seit geraumer Zeit in den Lesezeichen, aber auch hierfür vielen Dank.
Aber wie genau meinst du "Wenn du dich damit beschäftigst, musst du alle Sql-Klassen durch deine MySql-Klassen ersetzen;"? Das will mir nich so recht in den Schädel...

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Dein Verfahren mit einer ClassSqlConnection-Klasse und static-Methoden ist ziemlich unpraktisch. Vergiss es am besten schnell wieder. Ein Mini-Beispiel für ein sinnvolles Verfahren habe ich unter Insert ? Ado.net c# (erste Antwort) gebracht.
Inwiefern ist das denn unpraktisch? Ich nutze meine Klasse - momentan - nur so: (Ich habe sie in "SQL" umbenannt, weil mir gerade so war.)
ausblenden Quelltext
1:
2:
3:
            SQL ConnectionTry = new SQL();
            ConnectionTry.ConnectSql(2);
            ConnectionTry.CloseSql();

Außer, dass ich mir das ConnectionTry.CloseSql(); sparen könnte sehe ich da gerade keinen wirklichen Vorteil. Es wäre schön, wenn du mir das etwas näher bringen könntest. :)

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Für MySql kannst du nicht den Designer von VSC Express verwenden; der unterstützt nur MS-Produkte. Das halte ich aber für einen Vorteil; dann hast du immer die Kontrolle darüber, was passiert, und kannst nicht von der Arbeit des TableAdapters im Hintergrund verwirrt werden.
Ich benutze den Designer überhaupt nicht, weil ich erst mal verstehen möchte, wie genau das alles funktioniert. Ich habe mir nur mal angeschaut, wie der Designer ein Fenster und die Elemente, die ich verwenden möchte, aufbaut.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Siehe zusätzlich NET Richtlinien für Namen: Groß- und Kleinschreibung bei Klassen und Variablen, kein "Class" bei Klassen usw.
Nur weil Microsoft das sagt, wird das aber noch nicht zu Pflicht, oder? :shock:

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Ich hoffe, dass ich dich entmutigt habe. Viel Erfolg! Jürgen
Du hast auf jeden Fall einige Fragen aufgeworfen. Vielen Dank.

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

PS. Solange die Datenbank lokal liegt, funktioniert das. Wenn sie auf einem Internet-Provider liegt, kannst du in der Regel nicht direkt darauf zugreifen, sondern nur soweit, wie er es zulässt; dazu habe ich aber überhaupt keine Ahnung.
Das sollte bei MySQL-Datenbanken nicht das Problem sein, da man seinem Benutzer zuweisen kann, von welchem Host er auf die Datenbank(en) zugreifen darf.


Bitte entschuldige diesen zerhackten Post, aber ich denke, dass man so direkt sieht, worauf ich mich beziehe.


MfG Kenpachi
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: Do 03.12.09 10:46 
Hallo,

user profile iconKenpachi hat folgendes geschrieben Zum zitierten Posting springen:
Bitte entschuldige diesen zerhackten Post, aber ich denke, dass man so direkt sieht, worauf ich mich beziehe.

Nein, das finde ich gut so. Mir war auch klar, dass Sebastians Antwort dich wesentlich weitergebracht hat.

user profile iconKenpachi hat folgendes geschrieben Zum zitierten Posting springen:
Naja, mir ist schon klar, dass ich den Klassennamen auch als Namen für die Variable benutze. Da es aber keine Probleme verursacht, spielte das an dieser Stelle für mich keine Rolle, denn zum einen hilft Intellisense mir beim Unterscheiden und zum zweiten sieht - in der Regel - niemand meinen Code, außer mir. Ich hätte vielleicht "My_SqlConnection" nehmen sollen, um es direkt unterscheiden zu können, aber wie gesagt... Es spielte an dieser Stelle keine Rolle für mich.

Du solltest trotzdem darauf achten, weil es zur Klarheit beim Programmieren beiträgt. Außerdem kommst du in etwa einer Woche auch ins Grübeln, wenn du jetzt auf MySql-Klassen umsteigst und dann einen Code siehst, der MySql- und Sql-Bezeichner vermischt.

user profile iconKenpachi hat folgendes geschrieben Zum zitierten Posting springen:
"Wenn du dich damit beschäftigst, musst du alle Sql-Klassen durch deine MySql-Klassen ersetzen;"? Das will mir nich so recht in den Schädel...

Das ist einfacher gemeint: Überall dort, wo das OpenBook eine Sql-Klasse benutzt, musst du die gleiche Klasse aus MySql benutzen. Das ist ein Vorteil von ADO.NET: Jeder DbProvider benutzt weitgehend die gleiche Ableitung einer Db-Klasse mit den gleichen Methoden und Parametern. Ein Programm muss zwar an den jeweiligen DbProvider angepasst werden; aber das geht relativ leicht. Schwieriger ist, die Unterschiede der SQL-Dialekte zu beachten.

user profile iconKenpachi hat folgendes geschrieben Zum zitierten Posting springen:
[DbConnection:] Inwiefern ist das denn unpraktisch?

Eine Begründung ist zu lesen unter [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen.

user profile iconKenpachi hat folgendes geschrieben Zum zitierten Posting springen:
Ich benutze den Designer überhaupt nicht, weil ich erst mal verstehen möchte, wie genau das alles funktioniert. Ich habe mir nur mal angeschaut, wie der Designer ein Fenster und die Elemente, die ich verwenden möchte, aufbaut.

Sehr schön; wenn das doch jeder Anfänger machen würde. Den WinForms-Designer kannst du aber ruhig benutzen, der erleichtert die Arbeit wirklich. Es ist aber bei bestimmten Wünschen (Anpassung der Formulare zur Laufzeit) sehr hilfreich zu wissen, wie es im Hintergrund ablaufen kann und nachprogrammiert werden kann.

user profile iconKenpachi hat folgendes geschrieben Zum zitierten Posting springen:
[Namensgebung:] Nur weil Microsoft das sagt, wird das aber noch nicht zu Pflicht, oder? :shock:

Nein, natürlich nicht. Es ist aber äußerst hilfreich, sich daran zu orientieren. Beispielsweise können Missverständnisse beim Geltungsbereich von Variablen oder für Klassen/Instanzen vermieden werden. Außerdem sind "sprechende Namen" unbedingt zu empfehlen, statt TextBox27 usw. zu verwenden.

user profile iconKenpachi hat folgendes geschrieben Zum zitierten Posting springen:
Das sollte bei MySQL-Datenbanken nicht das Problem sein, da man seinem Benutzer zuweisen kann, von welchem Host er auf die Datenbank(en) zugreifen darf.

Das hatte ich vor allem erwähnt, weil immer wieder Nutzer erwarten, dass sie im Internet auf die MySql-Datenbank "ihres" Betreibers zugreifen können.

Viel Erfolg! Jürgen