2017-05-27 5 views
2


Je dois obtenir la valeur de la première colonne de la ligne mise à jour. Toutefois, lorsque j'exécute la requête Update ClaimDetails set sStatus='False' OUTPUT inserted.slno as Slno where inVoiceNo='******' and sStatus='True'
dans Management Studio, elle renvoie la bonne valeur. Mais lorsque je tente d'obtenir la valeur en utilisant Executescalar() retourne nullLa clause de sortie renvoie la valeur mais executescalar renvoie la valeur null dans C#

Mon code:

bool isupdated = false; 
     int modified=0; 
     try 
     { 

      string updateqry = "Update ClaimDetails set [email protected] OUTPUT inserted.slno as Slno where [email protected] and sStatus='True'"; 
      SqlCommand cmd = new SqlCommand(updateqry, con); 
      cmd.Parameters.AddWithValue("@sStatus", sStatus); 
      cmd.Parameters.AddWithValue("@inVoiceNo", inVoiceNo); 
      connect(); 
      if (cmd.ExecuteNonQuery() > 0) 
      { 
       isupdated = true; 
       //modified = (int)cmd.ExecuteScalar(); 
       object a = cmd.ExecuteScalar(); 
       if (a != null) 
        modified = Convert.ToInt32(a); 

      } 
     } 
     catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } 
     finally { disconnect(); } 
     return modified; 

Quand je modified = (int)cmd.ExecuteScalar(); il m'a donné une erreur d'exception si je object

+0

"cela m'a donné une erreur d'exception" quelle exception cela vous a-t-il donné? –

Répondre

1

Le code exécute deux fois la même commande UPDATE, une fois avec ExecuteNonQuery (qui supprime le résultat scalaire et renvoie le nombre de lignes affectées) et à nouveau avec ExecuteScalar. En raison du 'True' codé en dur dans la clause WHERE, la deuxième invocation de la même commande ne mettra jamais à jour une ligne lorsque la valeur sStatus fournie est 'False'. Le résultat scalaire sera toujours null dans ce cas.

Je pense que vous pouvez refactoriser le code comme ci-dessous pour obtenir le résultat souhaité.

object a = cmd.ExecuteScalar(); 
if (a != null) 
{ 
    isupdated = true; 
    modified = Convert.ToInt32(a); 
} 
+0

super ça marche, merci – mark

1

La seule fois que ExecuteScalar renvoie null si aucune ligne est renvoyée. Si une ligne est renvoyée et que la valeur estnull, DbNull.Value est renvoyée à la place.

Donc: aucune ligne ne correspond. Vérifiez ce que @inVoiceNo est, et si oui ou non il existe dans la table que vous utilisez. Raisons communes de confusion:

  • sensibilité à la casse dans la base de données
  • unicode vs ascii/code page valeurs
  • ombles vs varchar, nchar vs nvarchar
  • en cours d'exécution contre les données erronées
+0

J'ai couru la même question dans Management Studio, et il m'a donné le bon résultat, c'est-à-dire; '44019 'qui est juste – mark

+0

@mark alors maintenant vous devez le déboguer. Oubliez tout ce que vous pensez savoir sur les valeurs des paramètres et l'état de la base de données - et en effet, quelle base de données vous pensez que vous parlez. Vérifiez * tout * –