【发布时间】:2015-02-21 16:42:45
【问题描述】:
我有一个带有管理页面的 ASP.NET MVC 站点,我需要在其中合并两条记录。我传入了两个值,@old 和 @new。将这些添加到我的SqlCommand 对象后,我调用ExecuteNonQuery()。这会产生一个异常,消息说
存储过程“FixDuplicate”需要参数“@old”,它是 未提供
正如您在下面看到的,我肯定会添加参数。我试过的所有 3 个版本都在那里。
这段代码有什么问题?
版本一:(请忽略这个的语法,我已经把这段代码去掉了,但我确实试过了,在到达ExecuteNonQuery()调用时确认参数存在)
var sql = "FixDuplicate";
comm.Parameters.Add(new System.Data.SqlClient.SqlParameter("@old", model.Duplicate));
comm.Parameters.Add(new System.Data.SqlClient.SqlParameter("@new", model.Primary));
_dataAccessService.ExecuteSql(conn, comm);
版本 2:
comm.Parameters.AddWithValue("@old", model.Duplicate);
comm.Parameters.AddWithValue("@new", model.Primary);
版本 3:
comm.Parameters.Add("@old", System.Data.SqlDbType.Int);
comm.Parameters[0].Value = model.Duplicate;
comm.Parameters.Add("@new", System.Data.SqlDbType.Int);
comm.Parameters[1].Value = model.Primary;
最后,这是_dataAccessService.ExecuteSql(conn, comm) 调用中的代码:
public void ExecuteSql(SqlConnection connection, SqlCommand command, bool closeConnection = true)
{
if (connection == null)
throw new ArgumentNullException("connection");
if (command == null)
throw new ArgumentNullException("command");
try
{
if (connection.State != ConnectionState.Open)
connection.Open();
try
{
command.ExecuteNonQuery();
}
catch
{
throw;
}
finally
{
if (closeConnection)
command.Dispose();
}
}
catch (Exception ex)
{
throw new Exception("Sorry, an error occurred ExecuteSql: " + ex.Message, ex);
}
finally
{
if (closeConnection)
connection.Dispose();
}
}
注意:我已确认“@old”和“@new”的值在到达ExecuteNonQuery() 行时已设置。
编辑:这是完整的代码,因为它存在:
// Here we need to execute the "FixDuplicate" stored procedure
var sql = "FixDuplicate";
var conn = _dataAccessService.GetConnection("");
var comm = _dataAccessService.GetCommand(conn, sql, System.Data.CommandType.StoredProcedure);
//comm.Parameters.AddWithValue("@old", model.DuplicateWrestler);
//comm.Parameters.AddWithValue("@new", model.PrimaryWrestler);
comm.Parameters.Add("@old", System.Data.SqlDbType.Int);
comm.Parameters[0].Value = model.DuplicateWrestler;
comm.Parameters.Add("@new", System.Data.SqlDbType.Int);
comm.Parameters[1].Value = model.PrimaryWrestler;
_dataAccessService.ExecuteSql(conn, comm);
【问题讨论】:
-
您是否考虑过创建一个辅助类或您自己的自定义类来传递参数并将它们添加到 foreach 循环中我将发布一个您可以做什么的示例
-
您确定 model.Duplicate 不为空吗?
-
@Salim 是的,我在问题中添加了“注释”...
-
添加参数后,为什么不通过实际名称而不是索引来分配其
@param名称的值,例如comm.Parameters["@old"].Value = model.DuplicateWrestler;我认为您可能还想参考@987654336 @方法在这里SqlCommand.Parameters.Add Method -
@DJKRAZE 我不是已经在调用 SqlCommand.Parameters.Add 方法了吗?
标签: c# sql-server asp.net-mvc sql-server-2008 sql-server-2008-r2