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);
可能是你model.Duplicate
是null
。在这种情况下,参数的值将不会被设置为。
如果您需要将null
更改为SqlParameter.Value
,请使用DBNull.Value
。
请参阅SqlParameter.Value以供参考。
我相信你需要指定一个命令类型:
command.CommandType = CommandType.StoredProcedure;
对不起,这已经在那里,我删除了,我认为是不必要的代码行。我将使用正在生产的完整版本进行更新... – ganders
我建议你使用Profiler来检查,如果旧的参数设置与否。 也尝试从SQL Server Management Studio运行此过程以确保其正常工作。
我一直在直接从SSMS运行存储过程几个月,现在我只是试图将它添加到应用程序中,因为我无法在工作中使用SSMS(他们阻止访问Sql云提供商)。 Profiler上的好主意,这将确认它可能[不]存在。当我回家时,我必须尝试。 – ganders
你有没有想过创建一个自己的帮助类或自定义类,它传递参数并将它们添加到foreach循环中我会发布一个你可以做的例子 – MethodMan
你确定model.Duplicate不是空值? – Salim
@Salim是的,我添加了一个“注释”的问题... – ganders