Laden...

Kann nicht über Programm auf SQL Server 2005 in einem Netzwerk zugreifen

Erstellt von rezico vor 11 Jahren Letzter Beitrag vor 11 Jahren 4.117 Views
R
rezico Themenstarter:in
11 Beiträge seit 2011
vor 11 Jahren
Kann nicht über Programm auf SQL Server 2005 in einem Netzwerk zugreifen

Hiho,
und zwar habe ich auf einem Server SQL Studio 2005 installiert. Dort ist eine DB angelegt, auf die ich gerne über mein Programm zugreifen würde.

Ich habe bereits alle Ports freigeschalten und das merkwürdige: Über den Server-Explorer im Visual Studio komme ich auch auf den Server, d. h. die Verbindung schlägt nicht fehl.

Ich habe eine Loginmaske gebaut, in der der User Server, User, PW und DB eingeben muss. Danach wird dadurch der ConnectionString gebaut. Das hat in der Regel auch funktioniert (hatte vorher beispielsweise eine lokale Xampp-Installation laufen -> Funktioniert, oder auch schon eine Online-DB bei All-inkl.de - hat alles funktioniert.

Der Connectionstring wird folgendermaßen zusammengesetzt:

connection = new MySqlConnection(@"Data Source=" + dbhost + ";User Id=" + dbname + ";Password=" + dbpassword + ";Initial Catalog=" + dbdb + ";");

Ich bekomme immer die Fehlermeldung: "Unable To Connect to one of the specified Hosts" - ich kanns mir mittlererweile nicht mehr erklären. Hat vielleicht einer eine Idee? Fehlt mir ein Port, mache ich irgendwas falsch?

Vielen Dank für eure Hilfe!

B
198 Beiträge seit 2005
vor 11 Jahren

Hallo,

Baue deinen ConnectionString besser mit dem ConnectionStringBuilder.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder.aspx

R
rezico Themenstarter:in
11 Beiträge seit 2011
vor 11 Jahren

Das hatte ich auch schon versucht, war mir letztendlich dann zu viel Code für die kleine Zeile 😃 Hat schließlich auch damit ohne Probleme funktioniert.
Habe gerade auch herausgefunden, dass ich auch mit HeidiSQL nicht auf den Server komme.
Woran kann das liegen? Mit dem Server Explorer komme ich ja auch einfach drauf?!

Steh gerade echt auf dem Schlauch.

Danke!

R
317 Beiträge seit 2006
vor 11 Jahren

Hi,

connection = new [B]MySqlConnection[/B](@"Data Source=" + dbhost + ";User Id=" + dbname + ";Password=" + dbpassword + ";Initial Catalog=" + dbdb + ";");

Wieso erstellst du eine MySQL-Connection, wenn du auf einen SQL-Server zugreifen willst? Oder ist das ein Tippfehler? 😉

Daniel

R
rezico Themenstarter:in
11 Beiträge seit 2011
vor 11 Jahren

Das wars, stimmt.
Das heißt da kommen jetzt ein Arsch voll Arbeit auf mich zu... Supi.

Ich hab dazu jetzt nochmal ein paar Fragen...
*Gibt es eine Möglichkeit diese 2 Verbindungsmethoden zu kombinieren? *Ich habe es jetzt soweit umgeschraubt und bekomme eine Verbindung. Allerdings funktionieren jetzt eigentlich keine meiner Abfragen mehr. (Kleine info am Rande, Parameter sind hier ausnahmsweise nicht notwendig, da der User eigentlich keine Eingaben tätigen muss, sondern alles automatisiert abläuft - Das Programm ist im Grunde auch schon fertig, war aber vorher eben auf MySQL ausgelegt) - Ich bekomme immer die Fehlermeldung "Ungültiger Spaltenname XYZ". Hab jetzt auch schon ne Weile gegoogelt, und mir wird gesagt, dass es an den Hochkommas liegt. Hab jetzt schon alle möglichen Kombinationen probiert, es hilft aber alles nichts.

Hier mal Beispielcode (nach dem Login wird der Vorname des eingeloggten User ermittelt):

               
SqlCommand command2 = connection.CreateCommand();
                command2.CommandText = "SELECT vorname FROM mitarbeiter WHERE maid = '" + maid + "'";
                SqlDataReader Reader2;
                Reader2 = command2.ExecuteReader();

                while (Reader2.Read())
                {
                    mavorname = Reader2[0].ToString();
                }
                Reader2.Close();

Wie ist da die richtige Syntax? Und kann ich irgendwie verhindern, dass ich das nun überall ändern muss? Vielen Dank....

3.824 Beiträge seit 2006
vor 11 Jahren

Gibt es eine Möglichkeit diese 2 Verbindungsmethoden zu kombinieren?

Ja :

DbConnection connection = new ...

Siehe http://www.seven-c.de/files/datenbankenhowto.htm#10
Kapitel 11

Allerdings funktionieren jetzt eigentlich keine meiner Abfragen mehr.

So einfache Abfragen sollten immer noch funktionieren. Die SQL-Dialekte unterscheiden sich nur in den Details, z.B. TOP und LIMIT.

Wenn die ID ein Zahlenwert ist dann lass die Apostrophe weg, bei MS SQL und bei MySQL.

An den Hochkommas liegt der Fehler aber nicht, sondern daran dass die angesprochene Spalte in deiner SQL-Datenbank nicht existiert.

Es wäre trotzdem besser Parameter zu benutzen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

R
317 Beiträge seit 2006
vor 11 Jahren

Bei verschiedenen Datentypen wirst du immer ein bisschen was anpassen müssen, seis die Hochkommas, oder andere Sachen, die jede Datenbank etwas anders macht. Bei MySQL ist dann unter Linux z.B. auch zu beachten, dass es alles Case Sensitive ist.

Hier ist ein O/R-Mapper das vernüftigste, da viele hier das Mapping und die SQL-Befehle automatisch korrekt absetzen.

Deine Spalte "maid" ist die ID des Mitarbeiters, oder? Dann ist die Spalte vermutlich eine Zahl - also gehören hier bei der Abfrage keine Hochkomma hin, da diese einen String kennzeichnen.

Ansonsten kannst du die Typen "DbCommand", "DbConnection", "DbDataAdapter" usw. verwenden, die keinen speziellen Datenbanktypen zugeordnet sind. Also z.B.:


DbConnection Test = new MySqlConnection(ConnectionString);

Daniel

F
10.010 Beiträge seit 2004
vor 11 Jahren

@rezico:
Da kommt davon wenn man sich nicht vorher mit den Grundlagen beschäftigt.
[Artikelserie] SQL: Parameter von Befehlen
Und gleich noch [Artikel] Ressourcen schonen - Datenbanken richtig öffnen und schließen

Auch zeugt dein geposteter Code von sehr wenig Grundlagenwissen bezüglich ADO.NET


using( SqlConnection con = new SqlConnection (connectionString) )
{
	con.Open();
    using( SqlCommand cmd = new SqlCommand("SELECT vorname FROM mitarbeiter WHERE maid =@maid",con))
    {
		cmd.Paramaters.AddWithValue("@maid",maid );
		mavorname = cmd.ExecuteScalar() as string;
	}
}

Auch solltest Du mal verstehen das jeder SqlServer eine geringfügig andere Sql Syntax hat.

Das heißt da kommen jetzt ein Arsch voll Arbeit auf mich zu

Evtl den Datenzugriff vorher nicht zusammengefasst?

R
rezico Themenstarter:in
11 Beiträge seit 2011
vor 11 Jahren

Hallo,
vielen Dank für Eure Antworten.
Eins vorweg: Ja ich habe sehr wenig Grundlagenwissen, normalerweise bin ich ein Webheini, und da bin ich eher in der Extensionentwicklung für ein CMS zuständig. Aber das ist auch nur der Fall, wenn eine benötigt wird.

Ich habe also die Aufgabe bekommen, das Programm für die Firma zu entwickeln und hab mehr oder weniger drauf los getippselt (natürlich mit einem Ziel und Struktur, d. h. ich wusste wie es am Ende aussehen sollte) und mit einer mySQL Datenbank hat es funktioniert.
Als dann aber neuerdings die Anforderung kam, dass auf dem internen Server zu installieren, hatte ich meine erste Schwierigkeiten (siehe Post ^^) und wusste nicht direkt wohin. Im Grunde ist das hier mein erstes richtiges Programm und ich habe auch um ehrlich zu sein gar keine Zeit mich durch dutzende Wälzer über C# zu schlagen, wenn mein Hauptgebiet doch wo anders liegt.

Mittlererweile hat die Applikation ca. 4800 Zeilen Code (vermutlich kann man sich die Hälfte davon sparen 👍) und muss nichts desto trotz natürlich jetzt an die neuen Anforderungen angepasst werden.

Ich habe nun das ganze auf DbConnect umgedeixelt (und ja, mittlererweile weiß ich, dass sich die Statements unter den verschiedenen DB-Systemen unterscheiden) und würde das ganze jetzt 1. parametisieren und 2. versuchen so gut wie möglich eine All-Aroundlösung für verschiedene Systeme zu gestalten.

Dazu habe ich jetzt sämtliche Inserts & Updates in eine Funktion geschmissen, dort will ich dann das Query auseinanderpflücken und für die verschiedenen Systeme anpassen. Das gleiche will ich natürlich mit allen Selects, Deletes, usw. auch machen.

Doch zu allererst würde ich gerne wissen WODURCH sich die verschiedenen Querys unterscheiden, denn ich bekomme nach wie vor die Fehlermeldung mit den Spaltennamen und außerdem würde mich noch inetressieren, wie dein Beispielcode für dbConnection und nicht für SqlConnection aussieht (letzter Post, evtl. kann mir da nochmal jemand etwas auf die Sprünge helfen)

Wegen Performance: Natürlich habe ich nach jeder Abfrage die Verbindung geschlossen und im allgemeinen auch darauf geachtet so performancearm wie möglich zu arbeiten aber da es natürlich mein 1. größeres Projekt ist, kann ich auch nicht zaubern 🙂

Ach so: Es handelt sich um eine Zeiterfassung, falls es noch jemanden interessieren sollte, aber das sollte eher zweitrangig sein.

Ich danke wie immer für eure Hilfe. Es ist immer wieder schön zu sehen, dass es noch hilfsbereite Menschen gibt 🙂 Danke!

3.824 Beiträge seit 2006
vor 11 Jahren

Du kannst auf Deinem Rechner auch Microsoft SQL Server Express installieren und diesen benutzen. Dann brauchst Du keine Klimmzüge mit MySQL zu machen.

Wahrscheinlich ist es es schon installiert.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

R
rezico Themenstarter:in
11 Beiträge seit 2011
vor 11 Jahren

Die Software SQL Server 2005 ist auf unserem Server schon installiert und wird benötigt, da wir darüber unsere ERP Software laufen haben (und da muss eben meine DB drauf).

Das ist eben das Problem 😃

F
10.010 Beiträge seit 2004
vor 11 Jahren

Nein, das Problem ist das Du MySql benutzen wolltest, obwohl MsSql gefordert war.
Warum meinst Du denn Providerunabhängig sein zu wollen?

Auch ist die Frage warum Du nicht einen der kleinen Micro ORM benutzt!?
Simple.Data PetaPoco oder Dapper.

Mit den T4 bei PetaPoco bist du in 1-2 Stunden komplett durch und kannst anfangen produktiv zu sein.

R
rezico Themenstarter:in
11 Beiträge seit 2011
vor 11 Jahren

Hallo,
warum ich nicht sowas verwendet habe, kann ich dir relativ einfach beantworten. Ich wusste gar nicht dass es so etwas gibt 😃

Nichts desto trotz ist das Programm fertig. Es funktioniert alles einwandfrei und deshalb möchte ich höchstens noch Optimierungen durchführen und nicht komplett von vorne anfangen.

Warum Multiplattform? Dachte das wäre die beste Lösung, ich bleibe jetzt aber bei dem herkömmlichen SqlCommand.

Warum von mySql auf Mssql? Nein die Anforderung war nicht, dass es auf dem Server laufen sollte, ganz im Gegenteil. Es war gewünscht dass die DB im Netz steht (wir hatten damals noch einen Webserver im Haus, jetzt nicht mehr). Da mir damals MySql viel einfacher gefallen ist als Mssql (hatte damit noch überhaupt keine Erfahrungen) habe ich es auch auf mysql entwickelt.

Da meine Chefs aber keinen Plan von dem Unterschied haben, muss ich das Programm jetzt eben umfriemeln, da komm ich nicht drum herum.

Also next Step: Alle Abfragen umdeixeln und parametisieren. Gibt es irgendwo ein Snippet, in dem vielleicht gezeigt wird, wie ich das ganze über eine Funktion bauen kann, wodurch ich über Übergabeparameter die SQL Parameter einfach erweitere? Sodass ich nicht jede einzeln umschreiben muss sondern quasi eine Funktion habe die das für mich erledigt.

Vielen Dank! Habt mir schon sehr weitergeholfen.

F
10.010 Beiträge seit 2004
vor 11 Jahren

Sowas ist doch schnell erledigt.
Übergib ein Dictionary<string,object> und den SqlString.


protected int ExecuteNonQuery(string sql, Dictionary<string,object> param)
{
    using( var con = GetConnection())
    {
        con.Open();
        var cmd = new SqlCommand(sql,con);
        foreach( var kv in param)
        {
            cmd.Parameters.AddWithValue(kv.key,kv.value);
        }
        return cmd.ExecuteNonQuery();
    }
}

Ist nur so runtergetippt.

An deinen Herangehensweisen solltest Du aber was ändern, und erst die Grundlagen erlesen, dann passiert dir sowas in zukunft seltener.

3.824 Beiträge seit 2006
vor 11 Jahren

Ich habe meine Anwendung auch nachträglich auf Parameter umgestellt. Das ging so einfach dass ich mich gefragt habe warum ich das nicht schon früher gemacht habe.

Aus

public void ExecuteSql(string sqlstr)
{
    ...
}

Wurde

public void ExecuteSql(string sqlstr)
{
    ExecuteSql(string sqlstr, null);
}

public void ExecuteSql(string sqlstr, DbParameterCollection par)
{
    ...
}

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

C
252 Beiträge seit 2007
vor 11 Jahren