SQL Server无法识别我的参数

问题描述:

我有一个ASP.NET MVC网站与管理页面,我需要合并两个记录。我输入了两个值:@old@new。将这些添加到我的SqlCommand对象后,我将其称为ExecuteNonQuery()。这是生成与消息说异常SQL Server无法识别我的参数

存储过程“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

你有没有想过创建一个自己的帮助类或自定义类,它传递参数并将它们添加到foreach循环中我会发布一个你可以做的例子 – MethodMan

+0

你确定model.Duplicate不是空值? – Salim

+0

@Salim是的,我添加了一个“注释”的问题... – ganders

可能是你model.Duplicatenull。在这种情况下,参数的值将不会被设置为

如果您需要将null更改为SqlParameter.Value,请使用DBNull.Value

请参阅SqlParameter.Value以供参考。

+0

不,每次我设置我的断点时,我确认'@old'和'@new'已填充,并设置为正确的值。 – ganders

+0

只是为了证实这一点(现在我在工作,而不是坐在我的代码前面)。我刚刚进行了一次检查,以确保两个值都大于0.一旦我的云提供商构建并部署,我将再次运行并确保... – ganders

+0

我添加了一个检查以查看model.Primary> 0和model。重复> 0并且它没有返回验证错误。 – ganders

我相信你需要指定一个命令类型:

command.CommandType = CommandType.StoredProcedure; 
+0

对不起,这已经在那里,我删除了,我认为是不必要的代码行。我将使用正在生产的完整版本进行更新... – ganders

我建议你使用Profiler来检查,如果旧的参数设置与否。 也尝试从SQL Server Management Studio运行此过程以确保其正常工作。

+0

我一直在直接从SSMS运行存储过程几个月,现在我只是试图将它添加到应用程序中,因为我无法在工作中使用SSMS(他们阻止访问Sql云提供商)。 Profiler上的好主意,这将确认它可能[不]存在。当我回家时,我必须尝试。 – ganders