Spalten im DataTable vergleichen

lecoeur

Grünschnabel
Ich habe folgendes Problem.
Ich habe Select benutzt um die Werte in meiner DataTable zu bekommen.

C#:
string montant = txbmontant.Text;
cmd.CommandText = "SELECT pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using (pureenr) WHERE compartiment = " + montant;
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;

Jetzt moechte ich die Werte der Spalte "quantite" und "quantite_Cage" vergleichen. Ich will mich vergewissern dass die Werte der dritten Spalten(also jede Zeile vergleichen) tasächlich kleiner sind als die der 4 Spalte.

C#:
string montant = txbmontant.Text;
string sqlis = "SELECT pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using (pureenr) WHERE `quantite`< quantite_cage  AND compartiment = " + montant;
MySqlCommand cmdis = newMySqlCommand(sql, conn);
string resultat = cmdis.ExecuteScalar().ToString();
label.Text = "";
if (resultat == "")
{
label.Text = "Bestellmenge grösser als Mengen Im Lager";
}
else
{
label.Text = "Bestellmenge tatsächlich kleiner als Mengen Im Lager";
}

Ich bekomme zwar keinen Fehlermeldung aber Label.Text wird nicht genau angezeigt.

Kann es sein dass string Resultat ist falsch, (mit dem ".ExecuteScalar().ToString();")?

kann man direkt von der datatable vergleichen ohne noch mal die Datenbank abzufragen?


Danke im voraus
 
Zuletzt bearbeitet von einem Moderator:
Habe auch folgendes versucht. direkt von der DataTable zu vergleichen:

Code:
for (int i = 0; i < dtlivraison.Rows.Count; i++)
{
if (Convert.ToInt32(dtlivraison.Rows[i][2]) < Convert.ToInt32(dtlivraison.Rows[i][3]))
{
label.Text = "ist ok";
}
else
{
label.Text = "NICHT OK";
}
}

aber der Label zeigt immer "ist ok" obwohl eine Zahl in der 3.Spalte(Quantite) deutlich mehr als die Zahl in der 4.Spalte (quantite_Cage) .
 
Ich denke mal das "ist ok" im label steht, liegt einfach da dran das der letzte Datensatz deiner DataTable einfach true für deine bedingung liefert.
Du durchläufst ja die einzelnen zeilen.

Setzt eifnach mal ein breakpoint dann müsstest du sehen ob deine Bedingung eintritt.

Ansonsten könntest du theoretisch die werte auch direkt in deinem SQL mit abprüfen:
SQL:
SELECT id, name, wert1, wert2, (wert1<wert2) AS vergleich FROM tabelle
 
Zuletzt bearbeitet von einem Moderator:
Wow, Tausend mal danke. alles funktioniert super.

hätte noch eine Frage: wie könnte ich eine Column im DataTable mit der Farbe rot auffüllen.
Anstatt "NICHT OK" hätte ich gerne die 3.Spalte rot gehabt. Ist es möglich?
 
Ansonsten könntest du theoretisch die werte auch direkt in deinem SQL mit abprüfen:
SQL:
SELECT id, name, wert1, wert2, (wert1<wert2) AS vergleich FROM tabelle

Das hatte ich auch versucht. Nur was ich nicht geschafft habe, ist zu prüfen, ob mein Select etwas hatte oder nicht. Deswegen hatte ich folgende Code benutzt
Code:
string sqlis = "SELECT pureenr,puree_nom, quantite, quantite_cage FROM `commande` join cage using (pureenr) WHERE `quantite`< quantite_cage  AND compartiment = " + montant;
MySqlCommand cmdis = newMySqlCommand(sql, conn);
string resultat = cmdis.ExecuteScalar().ToString();
label.Text = "";
if (resultat == "")

Ich hatte ExecuteScalar().ToString() benutzt. Anscheinend geht es nicht. deswegen habe ich mit der Tabelle gearbeitet
 
ExecuteScalar liefert dir nur den wert der ersten Spalte des ersten Datensatzes.

Ich denke was du ev. verwenden sollteste wäre ExecuteReader.
Diesen reader könntest du Zeilenweise auslesen und dort die entsprechenden Spaltenwerte dann.
 
Dke, habe geschafft.


habe noch ein Verständnis Problem. Habe einiges geändert.

Code:
private void commande_Click(object sender, EventArgs e)
{
string abtnr = txbmontant.Text;
                bslivraison.DataSource = ds;
                bslivraison.DataMember = "dtlivraison";
                //Visualisierung Grid
                grdlivraison.DataSource = bslivraison;
              
                bslivraison.Filter = "compartiment = '" + txbmontant.Text + "'";
                for (int i = 0; i < dtlivraison.Rows.Count; i++)
                {
                    if (Convert.ToInt16(dtlivraison.Rows[i][3]) < Convert.ToInt16(dtlivraison.Rows[i][4]))
                    {
                        label.Text = "ist ok";
                    }
                    else
                    {
                        label.Text = "NICHT OK";
                        break;
                    }
                }
}

natürlich geht es hier nicht mehr um die dataTable dtlivraison, sonderm um die Filterung. Wie sollte ich bitte die For und if bearbeiten?
Wie sollte ich bitte die For- und If-Schleife bearbeiten, damit das Label.text gut angezeigt wird?
 
Was ist den ein compartiment?

Kommt bei deiner SQL Anweisung nur ein Datensatz zurück oder mehrere?

So wie du jetzt deine Schleife aufgebaut hast würde in deinem Label "ist ok" nur stehen wenn alle gelieferten Datensätze deine Bedingung erfüllen.
Sobald nur ein Datensatz diese Bedingung nicht erfüllt, erscheint "nicht ok" und du verlässt durch break die schleife.

Theoretisch könnte es erstmal so laufen wie du es vorhast.
Jetzt kommts halt drauf an was für Datensätze du bekommst.

Setzt einfach mal Breakpoint (standard Shortcut glaube F9) und schau mal ob VS dort beim debuggen überhaupt reinspringt.

P.S.:
Du musst nicht bei jeder Antwort danke sagen, machs wenn dann wenn problem gelöst ist ;)
 
Zurück