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
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
}
}
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:
using
-Anweisungen verwenden, um Ressourcen zuverlässig zu entsorgen.using
frei), wenn Sie eine Datenbankoperation ausführen möchten, und überlassen Sie dem Verbindungspool die EffizienzMein 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.
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