使用SQL命令作为C#中的参数值

时间:2017-04-19 13:23:32

标签: c# sql .net

我正在运行的SQL命令运行良好但是对于其中一个AddWithValue参数我想使用另一个SQL命令来获取该值...这就是我所拥有的但是我想要使用的cmd2不是工作。是否有可能以理论上的方式获取数据它是有意义的但它似乎不起作用..

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

3 个答案:

答案 0 :(得分:2)

我建议两个查询合并为一个:

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

答案 1 :(得分:1)

如果你想走这条路,你有两个选择:

  1. 在实例化第二个SqlCommand时合并这两个查询。这将需要在第二个命令中添加第二个参数。
  2. 或运行第一个命令。获取生成的acctNum并将其添加为第二个命令的值。
  3. 可能更好的方法是将两个查询重写为一个连接的查询。

答案 2 :(得分:0)

您必须使用cmd2.ExecuteReader()来获取 acctNum ,例如

您可以尝试以下代码

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"]);

  }
}

希望这会有所帮助..