【问题标题】:ExecuteScalar and ExecuteNonQuery collisionExecuteScalar 和 ExecuteNonQuery 冲突
【发布时间】:2019-08-27 10:59:52
【问题描述】:

ExecuteScalar 有问题,它不允许我使用ExecuteNonQuery,但我必须执行两个查询来获取最小日期(dateStart9 和最大日期( dateEnd) 在另一个表的选中项的日期范围之间。

sqliteCon.Open();
  if (sqliteCon.State == System.Data.ConnectionState.Open)
  {
    //query date non va a causa dell'execute scalar
    SqlCommand cmdDS = new SqlCommand("SELECT MIN(DateStartSE) AS DATESE FROM tabStoreExec JOIN tabList ON tabStoreExec.idSE=tabList.idL WHERE tabList.selection=1", sqliteCon);
    SqlCommand cmdDE = new SqlCommand("SELECT MAX(DateEndSE) AS DATEED FROM tabStoreExec JOIN tabList ON tabStoreExec.idSE=tabList.idL WHERE tabList.selection=1", sqliteCon);
    cmdDS.Parameters.AddWithValue("@DATESE", " DATESE");
    cmdDE.Parameters.AddWithValue("@DATEED", "DATEED");
    cmdDS.ExecuteNonQuery();
    cmdDE.ExecuteNonQuery();


  SqlCommand cmd1 = new SqlCommand("INSERT INTO tabStoricoDetail(NomeItem,ResItemDet,DateStartDet,DateEndDet) OUTPUT inserted.Id VALUES ('Prova','RProva',@DATESE,@DATEED)", sqliteCon);
  int generatedId = Convert.ToInt32(cmd1.ExecuteScalar());
  cmd1.Parameters.Clear();
  SqlCommand cmd2 = new SqlCommand("UPDATE tabStoreExec SET FK_TSD_id = @tsdId FROM tabList JOIN tabStoreExec ON tabList.idL = tabStoreExec.idSE WHERE tabList.selection=1 ", sqliteCon);
  cmd2.Parameters.AddWithValue("@tsdId", generatedId);
  cmd2.ExecuteNonQuery();

    MessageBox.Show("Dato Aggiunto");

  }
  sqliteCon.Close();

我接近解决方案,但错误是[声明标量变量“@DATESE”。' ]

【问题讨论】:

  • 我认为使用ExecuteNonQuery 执行SELECT 查询根本不会做任何事情。查询将执行,但您不会得到结果。也许您想要的是在前两个查询中使用ExecuteScalar 来实际获得结果。看起来您不需要这些查询的参数。
  • 唯一的问题是执行标量只能作用于第一行的第一项
  • 当您执行SELECT MIN(DateStartSE) 时,您只选择了一个值。您的 SELECT 返回一行一列。这正是ExecuteScalar 有意义的场景。
  • 对不起,你是对的

标签: c# sql sql-server wpf


【解决方案1】:

看来您应该将参数添加到cmdDScmdDEcmd1 instad。不过,您应该调用 ExecuteScalar() 从这些命令中获取值:

SqlCommand cmdDS = new SqlCommand("SELECT MIN(DateStartSE) AS DATESE FROM tabStoreExec JOIN tabList ON tabStoreExec.idSE=tabList.idL WHERE tabList.selection=1", sqliteCon);
SqlCommand cmdDE = new SqlCommand("SELECT MAX(DateEndSE) AS DATEED FROM tabStoreExec JOIN tabList ON tabStoreExec.idSE=tabList.idL WHERE tabList.selection=1", sqliteCon);
var DATESE = cmdDS.ExecuteScalar();
var DATEED = cmdDE.ExecuteScalar();


SqlCommand cmd1 = new SqlCommand("INSERT INTO tabStoricoDetail(NomeItem,ResItemDet,DateStartDet,DateEndDet) OUTPUT inserted.Id VALUES ('Prova','RProva',@DATESE,@DATEED)", sqliteCon);
cmd1.Parameters.AddWithValue("@DATESE", DATESE);
cmd1.Parameters.AddWithValue("@DATEED", DATEED);

【讨论】:

    【解决方案2】:

    执行前需要将参数@DATESE,@DATEED添加到cmd1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2011-06-29
      • 2012-12-24
      • 2012-09-10
      • 2012-08-24
      • 2021-03-06
      • 2015-04-06
      相关资源
      最近更新 更多