web-dev-qa-db-fra.com

Comment vérifier si une requête SQL réussit avec C #

Je suis nouveau en C # et SQL. Maintenant, depuis un formulaire, j'accède à une fonction dans une classe.

Mon code est

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();
    }

Maintenant, si un enregistrement n'existe pas dans la base de données avec la variable id donnée, l'application s'arrête immédiatement. Comment puis-je gérer cela? Je souhaite afficher un message indiquant que les données saisies sont incorrectes et demander à l'utilisateur de saisir d'autres données. 

9
Aravind Bharathy

ExecuteNonQuery () renvoie le nombre de lignes affectées par une instruction INSERT, UPDATE ou DELETE. Si vous devez vérifier l’exception SQL, vous devez inclure une instruction try catch dans votre fonction.

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 renvoie le nombre de lignes affectées. Si la valeur est 0, cela signifie qu'aucune ligne ne correspond à la mise à jour. Bien sûr, ce n’est que si la mise à jour "fonctionne" en termes de ne pas lancer d’exception ... alors que je soupçonne qu’elle génère une exception dans votre cas, ce qui signifie probablement que n’est pas à faire avec la ligne non. existant dans la base de données. (Il est possible qu'il y ait du code que vous n'avez pas montré qui fait dépend de la ligne existante, remarquez.)

Aditionellement:

  • Vous devez utiliser le SQL paramétré pour les paramètres all plutôt que d’inclure les valeurs directement dans votre code SQL. 
  • Vous devez utiliser des instructions using pour disposer des ressources de manière fiable.
  • Il semble que vous n'utilisiez qu'une seule connexion. Ne le faites pas. Créez (et supprimez via using) une nouvelle connexion chaque fois que vous souhaitez effectuer une opération de base de données, et laissez le pool de connexions gérer l'efficacité
  • Déterminez pourquoi l'application est en train de s'arrêter. Une exception est presque certainement levée et il est vraiment important que, lorsque cela se produit, vous obteniez les détails de l'exception. Vous pouvez voulez l'attraper et continuer (à un niveau élevé) en fonction du contexte exact ... mais vous devriez toujours au moins finir par le journaliser. 

Mon suppose (lors d’une inspection occasionnelle), c’est que le problème est que votre instruction de mise à jour tente de mettre à jour l’ID, qui est probablement en lecture seule. Mais vous le saurez lorsque vous corrigez la gestion de vos exceptions.

18
Jon Skeet

Je sais qu'il y a déjà une réponse postée mais essayons autre chose:

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 retournera une valeur bool 

0
John the horn