web-dev-qa-db-de.com

So prüfen Sie, ob eine SQL-Abfrage mit C # erfolgreich ist

Ich bin neu in C # und SQL. Nun greife ich von einem Formular auf eine Funktion in einer Klasse zu.

Mein Code lautet

public void updateSupplierInformation(string id, string name, string balance, string place, string address, string phone, string bankname, string bankbranch, string accountno)
{
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        SqlCommand NewCmd = conn.CreateCommand();
        NewCmd.Connection = conn;
        NewCmd.CommandType = CommandType.Text;
        NewCmd.CommandText = " update supplier set " + " ID = " + "'" + id + "'" + " , NAME = " + "'" + name + "'" + " , BALANCE = " + "'" + balance + "'" + " , PLACE = " + "'" + place + "'" + "  , LOCATION = " + "'" + address + "'" + ",  PHONE = " + "'" + phone + "'" + " , BANK_NAME = " + "'" + bankname + "'" + " , BANK_BRANCH = " + "'" + bankbranch + "'" + ", ACCOUNT_NO = " + "'" + accountno + "'" + " where ID = " + "@id";
        NewCmd.Parameters.AddWithValue("@id",id);
        NewCmd.ExecuteNonQuery(); 
        conn.Close();
    }

Wenn nun kein Datensatz mit der angegebenen id in der Datenbank vorhanden ist, stoppt die Anwendung sofort. Wie kann ich damit umgehen? Ich möchte eine Meldung anzeigen, dass die eingegebenen Daten falsch sind, und den Benutzer auffordern, andere Daten einzugeben 

9

ExecuteNonQuery () gibt die Anzahl der Zeilen zurück, die von einer INSERT-, UPDATE- oder DELETE-Anweisung betroffen sind. Wenn Sie die SQL-Ausnahme überprüfen müssen, müssen Sie eine Try-Catch-Anweisung in Ihre Funktion aufnehmen.

public void updateSupplierInformation(string id, string name, string balance, string place, string address, string phone, string bankname, string bankbranch, string accountno)
    {
       try
       {
        if (conn.State == ConnectionState.Closed)
        {
            conn.Open();
        }

        SqlCommand NewCmd = conn.CreateCommand();
        NewCmd.Connection = conn;
        NewCmd.CommandType = CommandType.Text;
        NewCmd.CommandText = " update supplier set " + " ID = " + "'" + id + "'" + " , NAME = " + "'" + name + "'" + " , BALANCE = " + "'" + balance + "'" + " , PLACE = " + "'" + place + "'" + "  , LOCATION = " + "'" + address + "'" + ",  PHONE = " + "'" + phone + "'" + " , BANK_NAME = " + "'" + bankname + "'" + " , BANK_BRANCH = " + "'" + bankbranch + "'" + ", ACCOUNT_NO = " + "'" + accountno + "'" + " where ID = " + "@id";
        NewCmd.Parameters.AddWithValue("@id",id);
        int a=NewCmd.ExecuteNonQuery(); 
        conn.Close();
        if(a==0)
          //Not updated.
        else
          //Updated.
        }
        catch(Exception ex)
         {
         // Not updated
         }
    }
20
sreejithsdev

ExecuteNonQuery gibt die Anzahl der betroffenen Zeilen zurück. Wenn dies 0 ist, bedeutet dies, dass keine übereinstimmenden Zeilen zum Aktualisieren vorhanden waren. Das ist natürlich nur dann der Fall, wenn das Update tatsächlich "funktioniert", wenn es keine Ausnahme gibt ... während ich vermute, dass es in Ihrem Fall eine Ausnahme auslöst, die wahrscheinlich nicht mit der Zeile nicht zu tun hat in der Datenbank vorhanden. (Möglicherweise gibt es Code, den Sie nicht gezeigt haben, der do von der vorhandenen Zeile abhängt, wohlgemerkt.)

Zusätzlich:

  • Sie sollten parametrisiertes SQL für all verwenden, anstatt die Werte direkt in Ihre SQL aufzunehmen. 
  • Sie sollten using-Anweisungen verwenden, um Ressourcen zuverlässig zu entsorgen.
  • Es sieht so aus, als würden Sie eine einzelne Verbindung verwenden - machen Sie das nicht. Erstellen Sie eine neue Verbindung (und geben Sie sie über using frei), wenn Sie eine Datenbankoperation ausführen möchten, und überlassen Sie dem Verbindungspool die Effizienz
  • Finden Sie heraus, warum die Anwendung gerade beendet wird. Es wird höchstwahrscheinlich eine Ausnahme ausgelöst, und es ist wirklich wichtig, dass Sie in diesem Fall die Details der Ausnahme erfahren. Sie können wollen es fangen und (abhängig von dem genauen Kontext) auf einem höheren Niveau weitermachen ... aber Sie sollten es immer mindestens beenden. 

Mein raten (bei einer gelegentlichen Überprüfung) besteht darin, dass das Problem darin besteht, dass Ihre Aktualisierungsanweisung versucht, die ID zu aktualisieren, die vermutlich schreibgeschützt ist. Sie werden dies jedoch feststellen, wenn Sie Ihre Ausnahmebehandlung korrigieren.

18
Jon Skeet

Ich weiß, dass bereits eine Antwort gepostet wurde, aber versuchen wir etwas anderes:

SqlConnection SQLConn = new SqlConnection("datahere");
SqlCommand SQLComm = new SqlCommand();
SQLcomm.Connection = SQLConn;
SQLConn.Open();
SQLComm.CommandText = "SQL statement goes here"
SqlDataReader dataReader = SQLComm.ExecuteReader();
dataReader.Read();
if(dataReader.HasRows == true){ //if it has rows do code
//do code
}
else{
// do other code
}

HasRows gibt einen bool-Wert zurück 

0
John the horn