Laden...

DataReader für logische Abfrage benutzen?

Erstellt von Deletemaster vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.146 Views
Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 16 Jahren
DataReader für logische Abfrage benutzen?

verwendetes Datenbanksystem: MySql
Hallo zusammen,

in meiner kleinen Anwendung möchte ich lediglich prüfen, ob eine bestimmte Telefonnummer in der db_tabelle vorhanden ist. Wenn ja Meldung <Meldung1>
Wenn Nein: <Meldung2>
Nun bekomme ich stets <Meldung2>, auch wenn die gesuchte Telefonnummer definitiv NICHT im Sysetm vorhanden ist?
An welcher Stelle liegt hier mein Fehler?

    protected void btn_KundeBestand_Click(object sender, EventArgs e)
    {
        string str_CheckVorwahl = txt_CheckVorwahl.Text;
        string str_CheckTelefon = txt_CheckTelefon.Text;
        string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

        if (str_CheckVorwahl != "" && str_CheckTelefon != "")
        {
            KundenBestandSuchen();
        }
        else
        {
            Alert.Show("Leere Felder sind unzulässig!!!");
        }
    }
//**************************************************************************************************
     private void KundenBestandSuchen()
     {
         string str_CheckVorwahl = txt_CheckVorwahl.Text;
         string str_CheckTelefon = txt_CheckTelefon.Text;
         string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

         MySqlCommand cmd = new MySqlCommand();
         cmd.Connection = conn;
         cmd.Parameters.Add("@telefon", str_CheckVrn);
         cmd.CommandText = "SELECT telefon AS str_CheckVrn FROM kunden";
         conn.Open();
         MySqlDataReader reader = cmd.ExecuteReader();
         if (reader.Read())
         {
             Alert.Show("Sorry, Kunde bereits im System vorhanden");
         }
         else
         {
             Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
         }
         reader.Close();

         conn.Close();
     }

Eigentlich ist der Code doch korrekt oder?
Wenn reader.Read(), also wenn gefunden...
sonst...

Danke für Eure Hilfe

3.511 Beiträge seit 2005
vor 16 Jahren

Es ist zwar ganz nett, das du den Parameter übergibst an das Command, nur solltest du es dann auch nutzen 😉

Dein SELECT müsste also so aussehen


SELECT telefon AS str_CheckVrn FROM kunden WHERE telefon = @telefon

Aber das ist keine elegante Lösung. Besser wäre


SELECT COUNT(*) FROM Kunden WHERE telefon = @telefon

und hinterher mit


int anzahl = (int)cmd.ExecuteScalar();
if (anzahl == 0)
  NichtDa();
else
  IstDa();

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

L
770 Beiträge seit 2006
vor 16 Jahren

Hallo,

sorry dein Code ist nicht richtig.
Zuerst einmal musst du ein WHERE einbauen, dass du auch die spez. Nummer abfragen kannst.

lg

lg Lion

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 16 Jahren

Hallo Khalid, danke für Deine Antwort.
Allerdings bekomme ich jetzt die Fehlermeldung: Die Angegebene Umwandlung ist ungültig.
Kann ich an der Stelle:
int anzahl = (int)cmd.ExecuteScalar();
zusätzlich noch eine Typumwandlung durchführen?
Danke

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 16 Jahren

@Lion1984,
sorry das habe ich inzwischen ergänzt, ganz klar, sonst ist ein Vergleich ja nicht möglich.
Jetzt habe ich nur das Problem mit der Typumwandlung.

private void KundenBestandSuchen()
     {
         string str_CheckVorwahl = txt_CheckVorwahl.Text;
         string str_CheckTelefon = txt_CheckTelefon.Text;
         string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

         MySqlCommand cmd = new MySqlCommand();
         cmd.Connection = conn;
         cmd.Parameters.Add("@telefon", str_CheckVrn);
         cmd.CommandText = "SELECT COUNT(*) AS anzahl FROM kunden WHERE telefon = @telefon";
         conn.Open();

         int anzahl = (int)cmd.ExecuteScalar();

         if (anzahl == 0)
             Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
         else
             Alert.Show("Sorry, Kunde bereits im System vorhanden");

         conn.Close();
     } 
3.511 Beiträge seit 2005
vor 16 Jahren

Hmm, kenne mich jetzt mit den mySQL nicht so aus. kann es vielleicht sein, das der NULL zurückliefert, wenn sein WHERE Teil kein Ergebnis findet? Das weis ich jetzt ehrlich gesagt nicht. Nimm mal eines ints mal ein object und schau dir im Debugger an, was für ein Typ genau zurückkommt vom Statement.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 16 Jahren

So klar Typkonvertierung durchgeführt.
Allerdings bekomme ich jetzt jedesmal die Meldung:
if (anzahl == 0)
Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
auch wenn diese Nummer bereits vorhanden ist???
eigentlich sollte hier kommen:
else
Alert.Show("Sorry, Kunde bereits im System vorhanden");

hier nochmal der komplette Code:

private void KundenBestandSuchen()
     {
         string str_CheckVorwahl = txt_CheckVorwahl.Text;
         string str_CheckTelefon = txt_CheckTelefon.Text;
         string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

         MySqlCommand cmd = new MySqlCommand();
         cmd.Connection = conn;
         cmd.Parameters.Add("@telefon", str_CheckVrn);
         cmd.CommandText = "SELECT COUNT(*) AS anzahl FROM kunden WHERE telefon = @telefon";
         conn.Open();

         int anzahl = Convert.ToInt32(cmd.ExecuteScalar());

         if (anzahl == 0)
             Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
         else
             Alert.Show("Sorry, Kunde bereits im System vorhanden");

         conn.Close();
     } 

Das verstehe ich nicht???
Deshalb war ja am Anfang die Idee:
Wenn Rufnummer gefunden: (if reader.read()
Eingabe möglich
else
Eingabe möglich
Wo liegt hier bitte mein Denkfehler?

E
27 Beiträge seit 2007
vor 16 Jahren

string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

Hier setzt du deine Telefonnummer zusammen.
Bist du sicher, dass die genau so ist, wie in der DB? evtl. irgendwelche Leerzeichen?

Sonst kommt mir gerade nichts in den Sinn.

3.511 Beiträge seit 2005
vor 16 Jahren

Denke auch, das jetzt der Wert in @telefon vielleicht nicht dem Format entspricht, wie er in der Datenbank vorkommt.

Hast du denn schonmal geschaut, ob denn der Parameter richtig gefüllt wird?
Bzw. das Statement mal gegen den mySQL Server prüfen.

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 16 Jahren

Hi, ich habe eben noch mal in der DB-Tabelle geschaut und ein Update durchgeführt.
Hier ist definitiv die vorwahl: 0123 und die Telefonnummer 456789
zusammengesetzt ergibt das 0123456789
die Telefonnummer ist als varchar also Text gespeichert, so daß evtl. auch keine führende null verlorengeht.
Habe auch versucht in Einzelschritten zu durchlaufen bzw. zu debuggen...
auch im Debugger wird die
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
mit dem Wert 0123456789 gefüllt...
habe versucht mir mal lediglich die Anzahl im Label auszugeben, auch hier bekomme ich 0 zurück???

private void KundenBestandSuchen()
     {
         string str_CheckVorwahl = txt_CheckVorwahl.Text;
         string str_CheckTelefon = txt_CheckTelefon.Text;
         string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

         string str_Anzahl = "SELECT COUNT(*) str_Anzahl FROM kunden WHERE telefon = @telefon";

         MySqlCommand cmd_Anzahl = new MySqlCommand(str_Anzahl, conn);
         conn.Open();
         MySqlDataReader reader = cmd_Anzahl.ExecuteReader();

         while (reader.Read())
         {
             lbl_fehler.Text = reader["str_Anzahl"].ToString(); // 0 wird ausgegeben
         }
         reader.Close();
}

Zu Testzwecken ist das die einzige Telefonnummer (Datensatz) in der Tabelle

Deletemaster Themenstarter:in
155 Beiträge seit 2005
vor 16 Jahren
[erledigt] private void KundenBestandSuchen()

Hallo @all,
habe den Fehler gefunden.
Der Einsatz des Parameters @ ist hier Falsch.
Richtig ist:

     private void KundenBestandSuchen()
     {
         string str_CheckVorwahl = txt_CheckVorwahl.Text;
         string str_CheckTelefon = txt_CheckTelefon.Text;
         string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

         MySqlCommand cmd = new MySqlCommand();
         cmd.Connection = conn;
         cmd.CommandText = "SELECT COUNT(*) AS anzahl FROM kunden WHERE telefon = '" + str_CheckVrn + "'";
         conn.Open();

         int anzahl = Convert.ToInt32(cmd.ExecuteScalar());

         if (anzahl == 0)
         {
             Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
         }
         else
         {
             Alert.Show("Sorry, Kunde bereits im System vorhanden");
         }

         conn.Close();
     } 
3.825 Beiträge seit 2006
vor 16 Jahren

Hallo Leute,

select count(*) ergibt in MySQL immer ein Ergebnis vom Typ Long :


try
{
	cmd.Connection.Open();
	dr = cmd.ExecuteReader(CommandBehavior.CloseConnection); // DataReader wird erzeugt
	if (dr.Read())
	{
		ftyp = dr[0].GetType().ToString(); // Zur Kontrolle fürs Debug
		if (dr[0].GetType() == typeof(Int64)) count = (int)(long)dr[0];				// MySQL gibt den Datentyp int64 zurück.
		else if (dr[0].GetType() == typeof(Decimal)) count = (int)(Decimal)dr[0];	// Oracle gibt den Datentyp decimal zurück.
		else count = (int)dr[0];
	}
}

Grüße Bernd

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

3.511 Beiträge seit 2005
vor 16 Jahren

@Deletemaster
Das ist aber ehrlich gesagt keine gute Lösung. Du solltest mit Parametern arbeiten. Immer! Bei MS-SQL wird der Parameter mit "@" angeführt. Ich denke mal, das es bei mySQL dann wohl anders ist (vielleicht "?"?). Das ist von DBMS zu DBMS unterschiedlich. Müsste aber schnell gefunden sein.

Kann dir garantiert auch hier jemand verraten 🙂

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)