Laden...

Webservice - Fehler SQL-Connect

Erstellt von Bench vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.745 Views
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 12 Jahren
Webservice - Fehler SQL-Connect

Hallo zusammen,

ich habe mit c# einen Webservice erstellt (DLL). Die DLL im "bin"-Verzeichnis abgelegt und eine passende config und asmx Datei erstellt. Läuft alles wunderbar!

NUR:
Ich kann keine SQL-Verbindung zum MySQL-Server auf dem Ubuntu-System aufbauen!
Folgender Fehler kommt:


System.Data.SqlClient.SqlException: Server does not exist or connection refused. ---> Mono.Data.Tds.Protocol.TdsInternalException: Server does not exist or connection refused
...

Folgenden Code benutze ich:


 public string[] xDBgetAccountdata(int xaccountid)
        {
            //Variablen
            string[] xrueckgabe = { };
            string connectionString = "Server=" + this.xhost + ";" + "Database=" + this.xdb + ";" + "User ID=" + this.xuser + ";" + "Password=" + this.xpw + ";";
            IDbConnection dbcon;
            using (dbcon = new SqlConnection(connectionString))
            {
                dbcon.Open();
                using (IDbCommand dbcmd = dbcon.CreateCommand())
                {
                    string sql = "SELECT * FROM xaccount WHERE accountid=" + xaccountid;
                    dbcmd.CommandText = sql;
                    using (IDataReader xreader = dbcmd.ExecuteReader())
                    {
                        while (xreader.Read())
                        {
                            xrueckgabe[0] = xreader["id"].ToString();
                            xrueckgabe[1] = xreader["accountid"].ToString();
                            xrueckgabe[2] = xreader["user"].ToString();
                            xrueckgabe[3] = xreader["pw"].ToString();
                            xrueckgabe[4] = xreader["db"].ToString();
                        }
                    }
                }
                dbcon.Close();
            }            

            //Rückgabe
            return xrueckgabe;
        }

Wäre super, wenn mir jemand helfen könnte, dan was das liegen kann!?!?
Liegt das an meinem Code oder an der Konfiguration des Servers?

Danke und Grüße Bench

F
10.010 Beiträge seit 2004
vor 12 Jahren

MySql?
Und dann benutzt du SqlConnection?

Und ausserdem ist dieser Code genau so wie man ihn nicht schreiben sollte.

S
298 Beiträge seit 2006
vor 12 Jahren

Hi,

kann denn eine Verbindung mit dem Server hergestellt werden?
Mal ein Ping versucht bzw. eine Verbindung mit einem anderen Client
(HeidiSql, Database Brower, etc) versucht?

Und wo ich mir das grad nochmal durchlese:
Bist du dir sicher, dass man mit der SqlConnection sich mit einem MySQL Server
verbinden kann?

Ich habe dafür immer den ADO.NET Adapter von MySQL verwendet. Damit gab es nie Probleme.

Gruß SkySurfer

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 12 Jahren

Danke für die rache Antwort!

Könnt ihr mir ein Beispiel posten wie ich das richtig mache!
Nur eine Anregung !!!
Bin hier noch nicht so fit!
Danke

S
298 Beiträge seit 2006
vor 12 Jahren

Also den Connector bekommst du hier : MySQL ADO.NET Connector

Ein ganz brauchbares Beispiel gibt es hier : MySQL .NET With C#

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 12 Jahren

Jetzt habe ich es so!


public string[] xDBgetAccountdata(int xaccountid)
        {
            //Variablen
            string[] xrueckgabe = { };
            string connectionString = "Data Source=" + this.xhost + ";" + "Persist Security Info=yes;" + "Database='" + this.xdb + "';" + "UserId=" + this.xuser + ";" + "PWD=" + this.xpw + ";";

            MySqlConnection connection = new MySqlConnection(connectionString);
            MySqlCommand command = connection.CreateCommand();
            command.CommandText = "SELECT * FROM xaccount WHERE accountid=" + xaccountid;
            MySqlDataReader xreader;
            connection.Open();
            xreader = command.ExecuteReader();
            while (xreader.Read())
            {
                xrueckgabe[0] = xreader["id"].ToString();
                xrueckgabe[1] = xreader["accountid"].ToString();
                xrueckgabe[2] = xreader["user"].ToString();
                xrueckgabe[3] = xreader["pw"].ToString();
                xrueckgabe[4] = xreader["db"].ToString();
            }
            connection.Close();

            //Rückgabe
            return xrueckgabe;
        }

und dann kommt der Fehler am Server:


System.InvalidProgramException: Missing or incorrect header for method xDBgetAccountdata

Was hat das nu wieder zu bedeuten?
Muss ic hier noch was machen!?
Liegt das an using MySql.Data.MySqlClient;?

Danke und Grüße

S
298 Beiträge seit 2006
vor 12 Jahren

Fehlt vielleicht der Verweis auf die MySQL Connector DLL?

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 12 Jahren

Nein, den habe ich im Project schon eingebunden!
Ich kann die Klassenbib. auch ohne Fehler kompeilieren!

Auf dem Server müsste ich doch dann eigentlich nichts merh einstellen!?

S
298 Beiträge seit 2006
vor 12 Jahren

Hast du alle zugehörigen Dateien des MySQL Connectors auf den Server deployed ?

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 12 Jahren

Nein, wie geht das?
Boa, sorry für die Anstrengung!
Aber ich habe mit Webapplicationen noch keine so ne Ahnung!

Muss ich die auch in das BIN-Verzeichnis legen wo meine DLL liegt oder wie mach ich das?

Der Server ist angemietet!!!! Ich kann hier nichts dran ändern!?

156 Beiträge seit 2010
vor 12 Jahren

Hallo,

wir können auch nur raten ? ;:-)
hast du in deinem Webservice auch das Attribute "[WebMethod]" gesetzt ?

S
298 Beiträge seit 2006
vor 12 Jahren

Wirf die Dateien in das gleiche Verzeichnis wie deine DLL hier sollte auch gesucht werden wenn Sie im GAC nicht gefunden werden.

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 12 Jahren

Hier meine drei Klassen:

  1. Klasse = Einstieg

using System;
using System.Web.Services;

namespace XNWebdienstvakanza
{
    [WebService(Namespace = "http://webservice.ais2000.de/")]
    public class XWebdienstvakanza : WebService
    {
        /// <summary>
        /// Methode "Hallo Vakanza"
        /// </summary>
        /// <returns></returns>
        [WebMethod]
        public string sayHelloVakanza()
        {
            return "Hello Vakanza";
        }

        [WebMethod]
        public string[] getUserData(int accountid)
        {
            //Config aufrufen
            XConfig xconfig = new XConfig();
            xconfig.xgetAccountData(accountid);

            //Daten in ein Array Speichern
            string[] xuserdata = { xconfig.getXuser(), xconfig.getXpw(), xconfig.getXdb() };

            //Rückgabe
            return xuserdata;
        }
    }
}

Dann meine Helperklassen Config und DBhandler


using System;
using MySql.Data.MySqlClient;


namespace XNWebdienstvakanza
{
    /// <summary>
    /// DB Handler
    /// </summary>
    class XDBhandler
    {
        //Variabeln
        private string xhost = "***"; // Hier halt dann die richtigen Daten
        private string xuser = "***";
        private string xpw = "***";
        private string xdb = "***";

        /// <summary>
        /// Holt die Accountdaten
        /// </summary>
        /// <param name="xaccountid"></param>
        /// <returns></returns>
        public string[] xDBgetAccountdata(int xaccountid)
        {
            //Variablen
            string[] xrueckgabe = { };
            string connectionString = "Data Source=" + this.xhost + ";" + "Persist Security Info=yes;" + "Database='" + this.xdb + "';" + "UserId=" + this.xuser + ";" + "PWD=" + this.xpw + ";";

            MySqlConnection connection = new MySqlConnection(connectionString);
            MySqlCommand command = connection.CreateCommand();
            command.CommandText = "SELECT * FROM xaccount WHERE accountid=" + xaccountid;
            MySqlDataReader xreader;
            connection.Open();
            xreader = command.ExecuteReader();
            while (xreader.Read())
            {
                xrueckgabe[0] = xreader["id"].ToString();
                xrueckgabe[1] = xreader["accountid"].ToString();
                xrueckgabe[2] = xreader["user"].ToString();
                xrueckgabe[3] = xreader["pw"].ToString();
                xrueckgabe[4] = xreader["db"].ToString();
            }
            connection.Close();

            //Rückgabe
            return xrueckgabe;
        }
    }

}


using System;

namespace XNWebdienstvakanza
{
    class XConfig
    {
        //Globale Variabeln
        private string xuser = "";
        private string xpw = "";
        private string xdb = "";

        /// <summary>
        /// Setzt die Accountdaten
        /// </summary>
        /// <param name="accountid"></param>
        public void xgetAccountData(int accountid)
        {
            //Db Handler
            XDBhandler xdb = new XDBhandler();
            string[] xaccountdaten = xdb.xDBgetAccountdata(accountid);
            //Daten global zur Verfügung stellen
            this.xuser = xaccountdaten[2];
            this.xpw = xaccountdaten[3];
            this.xdb = xaccountdaten[4];
        }

        /// <summary>
        /// Gibt username zurück
        /// </summary>       
        /// <returns></returns>
        public string getXuser()
        {
            return this.xuser;
        }

        /// <summary>
        /// Gint das PW zurück
        /// </summary>       
        /// <returns></returns>
        public string getXpw()
        {
            return this.xpw;
        }

        /// <summary>
        /// Gint die Datenbank zurück
        /// </summary>        
        /// <returns></returns>
        public string getXdb()
        {
            return this.xdb;
        }


    }
}

Muss ich auch in meinen Helferklassen die Webmethod setzten und die Klasse von Webservice ableiten!?

S
298 Beiträge seit 2006
vor 12 Jahren

Nur Methoden die von deinem WebService bereit gestellt werden sollen
benötigen das WebMethod Attribut

Erster Treffer bei Google

Es gibt 11 Arten von Menschen:

  • Die, die binär verstehen
  • Die, die es nicht tun
  • Die, die Witze darüber machen
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 12 Jahren

DAAAAAAAANKKKKEE!

Es geht!!!

Folgendes war:
> DLL hat im bin-Verzeichnis des Webservice gefehlt!
> Auf dem Server läuft nur Framework 2.0 und nocht 4.0!!!.-(((

Naja, jetzt gehts!!

Danke für die Hilfe

F
10.010 Beiträge seit 2004
vor 12 Jahren

Du kommst bestimmt von Java,oder?

Der Code sieht immer noch schlecht aus.

  1. Getter werden in .NET als Properties ( ggf ReadOnly ) ausgeführt.
  2. [Artikelserie] Parameter von SQL Befehlen
  3. Das Password selber zu speichern ist ein sicherheitsrisiko.
  4. Was soll die schleife beim Read? Warum keinen DataAdapter?
  5. strings setzt man besser mit string.Format zusammen
  6. Try/Catch? Schonmal von gehört?
B
Bench Themenstarter:in
148 Beiträge seit 2008
vor 12 Jahren

HI,

😃 Ja, ich komme von Java! 😃

Danke für die Tips!
Ich werde den Code natürlich noch optimieren!
Mir ging es jetzt nur mal darum, ob es vom Prinzip her so funtioniert, wie ich es mir vorstelle!

Ein Lob an das Froum!!!
Das geht hier wirklich alles super schnell!
Super Community!!!!

Danke und bis bald 😃!!

Gruß

F
10.010 Beiträge seit 2004
vor 12 Jahren

Ich werde den Code natürlich noch optimieren!

Glaube ich nicht, denn nichts ist beständiger als das Provisorium oder
code der "Funktioniert doch".

Mach es lieber gleich richtig, geht ausserdem auch schneller und sauberer als das was Du gemacht hast.