【问题标题】:Batch query exception批量查询异常
【发布时间】:2018-09-19 17:24:52
【问题描述】:

当我在 C# 中执行以下代码时,我可以毫无问题地插入一条记录。当我的集合中有两个对象时,我收到以下错误:

变量名称“@scoreboardId”已被声明。变量名称在查询批处理或存储过程中必须是唯一的

有没有办法解决这个批处理异常?

public void insertActiveMonitorsForScoreboard(SqlConnection dbConn, SqlTransaction dbTrans, int scoreboardId,
                                              ObservableCollection<AvailableMonitorBo> availableMonitorsForAddOC) 
{         
    using (SqlCommand dbCommand = new SqlCommand(CreateAndDisplaySQLStrings.INSERT_SCOREBOARD_MONITORS, dbConn)) 
    {
        dbCommand.Transaction = dbTrans;

        foreach (AvailableMonitorBo bo in availableMonitorsForAddOC) 
        {
            if (bo.IsActive) 
            {
                dbCommand.Parameters.Add("scoreboardId", SqlDbType.Int).Value = scoreboardId;
                dbCommand.Parameters.Add("availableMonitorId", SqlDbType.Int).Value = bo.AvailableMonitorId;

                dbCommand.ExecuteNonQuery();
            }                   
        }               
    }
}

【问题讨论】:

标签: c# sql sql-server


【解决方案1】:

尝试只添加一次参数,然后只更改它们的值。

public void insertActiveMonitorsForScoreboard(SqlConnection dbConn, SqlTransaction dbTrans, int scoreboardId,
 ObservableCollection<AvailableMonitorBo> availableMonitorsForAddOC) {         
     using (SqlCommand dbCommand = new SqlCommand(CreateAndDisplaySQLStrings.INSERT_SCOREBOARD_MONITORS, dbConn)) {
           dbCommand.Transaction = dbTrans;
           dbCommand.Parameters.Add("scoreboardId", SqlDbType.Int);
           dbCommand.Parameters.Add("availableMonitorId", SqlDbType.Int);
           foreach (AvailableMonitorBo bo in availableMonitorsForAddOC) {
               if (bo.IsActive) {
                   dbCommand.Parameters["scoreboardId"].Value = scoreboardId;
                   dbCommand.Parameters["availableMonitorId"].Value = bo.AvailableMonitorId;
                   dbCommand.ExecuteNonQuery();
              }                   
        }               
    }
}

【讨论】:

  • 我认为您的语法中有错字:“dbCommand.Parameters.["scoreboardId"]" 应该是 "dbCommand.Parameters["scoreboardId"]"。
  • 这行得通。时间到了我会接受的。不过我没用这个。我只需要在执行后清除参数,如下所示:myCommand.Parameters.Clear();
【解决方案2】:

另一种方法是将 SqlCommand 放入循环中。这样做的好处是 SqlCommand 对于每个循环都是全新的,因此在迭代之间没有任何东西被结转。这在本例中无关紧要,但在其他情况下可能。

public void insertActiveMonitorsForScoreboard(SqlConnection dbConn, SqlTransaction dbTrans, int scoreboardId,
 ObservableCollection<AvailableMonitorBo> availableMonitorsForAddOC) {         
   foreach (AvailableMonitorBo bo in availableMonitorsForAddOC) {
       if (bo.IsActive) {
           using (SqlCommand dbCommand = new SqlCommand(CreateAndDisplaySQLStrings.INSERT_SCOREBOARD_MONITORS, dbConn)) {
               dbCommand.Transaction = dbTrans;
               dbCommand.Parameters.Add("scoreboardId", SqlDbType.Int).Value = scoreboardId;
               dbCommand.Parameters.Add("availableMonitorId", SqlDbType.Int).Value = bo.AvailableMonitorId;
               dbCommand.ExecuteNonQuery();
          }                   
       }               
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2013-09-07
    相关资源
    最近更新 更多