J'ai une commande SQL que j'exécute qui fonctionne très bien, mais pour l'un des paramètres AddWithValue, je veux utiliser une autre commande SQL pour obtenir cette valeur ... c'est ce que j'ai mais le cmd2 que je veux utiliser ne fonctionne pas. Est-il même possible d'obtenir des données de cette façon en théorie, cela a du sens, mais cela ne semble pas fonctionner.

    cmd2 = new SqlCommand("SELECT acctNum FROM custInfo WHERE customerName = @customerName", cn);
    cmd2.Parameters.AddWithValue("@customerName", customerDropDown.Text);

    cmd = new SqlCommand("UPDATE custInfo SET ctGal = (ctGal - (@contractGallons)) WHERE acctNum = @acctNum", cn);

    cmd.Parameters.AddWithValue("@contractGallons", gallonsTextBox.Text)        
    cmd.Parameters.AddWithValue("@acctNum", cmd2);
0
ksuProgrammer 19 avril 2017 à 16:23

3 réponses

Meilleure réponse

Vous devez utiliser cmd2.ExecuteReader() pour obtenir le acctNum par exemple

Vous pouvez essayer le code suivant

using (SqlDataReader reader = cmd2.ExecuteReader())
{
  if (reader.Read())
  {
    cmd = new SqlCommand(@"UPDATE custInfo SET ctGal = (ctGal - 
     (@contractGallons)) WHERE acctNum = @acctNum", cn);

    cmd.Parameters.AddWithValue("@contractGallons", gallonsTextBox.Text)        
    cmd.Parameters.AddWithValue("@acctNum", reader["acctNum"]);

  }
}

J'espère que cela vous aidera ..

0
Dmitry Bychenko 19 avril 2017 à 14:43

Vous avez deux choix si vous souhaitez emprunter cette voie:

  1. Combinez les deux requêtes lorsque vous instanciez le deuxième SqlCommand. Cela nécessitera l'ajout d'un deuxième paramètre à la deuxième commande.
  2. Ou exécutez la première commande. Récupérez le acctNum résultant et ajoutez-le en tant que valeur pour la deuxième commande.

Il serait probablement préférable de réécrire les deux requêtes en une seule requête jointe.

1
Kempeth 19 avril 2017 à 13:32

J'ai suggéré de combiner les deux requêtes en une seule:

//DONE: let keep query readable
string sql = 
  @"UPDATE custInfo 
       SET ctGal = (ctGal - (@contractGallons)) 
     WHERE acctNum IN (SELECT c.acctNum
                         FROM custInfo c 
                        WHERE c.customerName = @customerName)";

//DONE: wrap IDisposable into using
using (var cmd = new SqlCommand(sql, cn)) {
  //TODO: get rid of AddWithValue, but specify the actual fields' types
  cmd.Parameters.AddWithValue("@contractGallons", gallonsTextBox.Text);
  cmd.Parameters.AddWithValue("@customerName", customerDropDown.Text);

  cmd.ExecuteNonQuery();
}
2
Dmitry Bychenko 19 avril 2017 à 13:36