SQL Server无法识别我的参数

时间:2014-12-23 14:11:05

标签: c# sql-server asp.net-mvc sql-server-2008 sql-server-2008-r2

我有一个带有管理页面的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);

3 个答案:

答案 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运行此过程以确保它正常工作。