我有一个带有管理页面的ASP.NET MVC站点,我需要合并两个记录。我传递了两个值@old
和@new
。将这些内容添加到SqlCommand
对象后,我会调用ExecuteNonQuery()
。这会产生一个异常,并显示消息
存储过程'FixDuplicate'需要参数'@old' 没提供
如下所示,我肯定会添加参数。我尝试过的所有3个版本都在那里。
这段代码出了什么问题?
版本1:(请忽略此版本的语法,我已经删除了此代码,但我确实已尝试并确认参数在到达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);
答案 0 :(得分:0)
您的model.Duplicate
可能是null
。在这种情况下,参数的值将不会设置。
如果您需要将null
传递给SqlParameter.Value
,请使用DBNull.Value
。
请参阅SqlParameter.Value以供参考。
答案 1 :(得分:0)
我认为您需要指定命令类型:
command.CommandType = CommandType.StoredProcedure;
答案 2 :(得分:0)
我建议您查看Profiler是否设置了旧参数。 并尝试从SQL Server Management Studio运行此过程以确保它正常工作。