必须声明标量变量" @ historyId"例外

时间:2014-07-30 06:57:26

标签: sqlcommand sqlparameters

我有一个原始的Sql命令执行

using (var cmd = SqlUtils.CreateSqlCommand(cmdText, sqlConn))
    {
      cmd.Parameters.Add(new SqlParameter("historyId", SqlDbType.Int)).Value = AAverage.CashFlowRelevantHistoryId;
      cmd.Parameters.Add(new SqlParameter("nodeId", SqlDbType.Int)).Value = AAverage.CashNodeId;
      cmd.Parameters.Add(new SqlParameter("denomId", SqlDbType.Int)).Value = AAverage.DenominationId;
      cmd.Parameters.Add(new SqlParameter("dayId", SqlDbType.Int)).Value = AAverage.CashFlowDayCategoryId;
      cmd.Parameters.Add(new SqlParameter("hour", SqlDbType.Int)).Value = AAverage.Hour;
      cmd.Parameters.Add(new SqlParameter("type", SqlDbType.Int)).Value = AAverage.ValueType;
      cmd.Parameters.Add(new SqlParameter("average", SqlDbType.Real)).Value = AAverage.AverageDerivative;

      using (var reader = cmd.ExecuteReader())
        if (reader.HasRows && reader.Read())
        {
          IDataRecord record = (IDataRecord)reader;
          AAverage.Id = record.GetInt32ByName("Id");
        }
    }

但如果我将其更改为使用SqlQuery方法,我会在主题中收到错误:

  StringBuilder cmdText = new StringBuilder();
  cmdText.AppendLine("INSERT INTO CashFlowAverageDerivatives");
  cmdText.AppendLine("  (CashFlowRelevantHistoryId, CashNodeId, DenominationId, CashFlowDayCategoryId, Hour, ValueType, AverageDerivative)");
  cmdText.AppendLine("VALUES");
  cmdText.AppendLine("  (@historyId, @nodeId, @denomId, @dayId, @hour, @type, @average)");
  cmdText.AppendLine("SELECT Id FROM CashFlowAverageDerivatives WHERE @@ROWCOUNT > 0 and Id = scope_identity()");
  AAverage.Id = ADbContext.Database.SqlQuery<int>(
    cmdText.ToString(),
    new SqlParameter("historyId", SqlDbType.Int).Value = AAverage.CashFlowRelevantHistoryId,
    new SqlParameter("nodeId", SqlDbType.Int).Value = AAverage.CashNodeId,
    new SqlParameter("denomId", SqlDbType.Int).Value = AAverage.DenominationId,
    new SqlParameter("dayId", SqlDbType.Int).Value = AAverage.CashFlowDayCategoryId,
    new SqlParameter("hour", SqlDbType.Int).Value = AAverage.Hour,
    new SqlParameter("type", SqlDbType.Int).Value = AAverage.ValueType,
    new SqlParameter("average", SqlDbType.Real).Value = AAverage.AverageDerivative
  ).First<int>();

我不明白为什么。如果我试图重命名&#34; historyId&#34;在Sql文本中的其他内容,异常报告此新名称。似乎参数定义丢失或拼写错误,但参数列表已被复制和粘贴,VS IDE搜索命令找到它,前缀&#34; @&#34;无所谓......

当然,我可以使用我的工作版本,但我正在学习EF并且它取笑我,我无法解决这个问题

1 个答案:

答案 0 :(得分:1)

您直接将sql参数作为值发送。

当你这样做时

new SqlParameter("historyId", SqlDbType.Int).Value = AAverage.CashFlowRelevantHistoryId

您实际上发送的值为AAverage.CashFlowRelevantHistoryId,而不是SqlParameter

尝试使用此更改它,看看它是否有效。

AAverage.Id = ADbContext.Database.SqlQuery<int>(
  cmdText.ToString(),
  new SqlParameter("historyId", AAverage.CashFlowRelevantHistoryId),
  new SqlParameter("nodeId", AAverage.CashNodeId),
  new SqlParameter("denomId", AAverage.DenominationId),
  new SqlParameter("dayId", AAverage.CashFlowDayCategoryId),
  new SqlParameter("hour", AAverage.Hour),
  new SqlParameter("type", AAverage.ValueType),
  new SqlParameter("average", AAverage.AverageDerivative)
).First<int>();

或者这个

AAverage.Id = ADbContext.Database.SqlQuery<int>(
  cmdText.ToString(),
  new SqlParameter("historyId", SqlDbType.Int) { Value = AAverage.CashFlowRelevantHistoryId },
  new SqlParameter("nodeId", SqlDbType.Int) { Value = AAverage.CashNodeId },
  new SqlParameter("denomId", SqlDbType.Int) { Value = AAverage.DenominationId },
  new SqlParameter("dayId", SqlDbType.Int) { Value = AAverage.CashFlowDayCategoryId },
  new SqlParameter("hour", SqlDbType.Int) { Value = AAverage.Hour },
  new SqlParameter("type", SqlDbType.Int) { Value = AAverage.ValueType },
  new SqlParameter("average", SqlDbType.Real) { Value = AAverage.AverageDerivative }
).First<int>();