在EXEC sp_setapprole中处理SqlParameter中的单引号?

时间:2014-05-20 17:57:20

标签: c# winforms sqlcommand sqlparameter

我有一个执行SqlCommand的方法,并将结果返回给winforms应用程序。 我的方法是:

public bool ApplyRoles(string roleApp, string roleAppPassword)
{
     Command = new SqlCommand("EXEC sp_setapprole @roleApp, @rolePassword", Connection);
     AssignParam("roleApp", roleApp, SqlDbType.VarChar);
     AssignParam("rolePassword", roleAppPassword, SqlDbType.VarChar);
     bool ret = Command.ExecuteNonQuery() == -1;
     return ret;
}

并且AssignParam方法是这样的:

public void AssignParam(string name, object value, SqlDbType type)
{
    var parameter = new SqlParameter(name, type)
    {
         Value = value ?? DBNull.Value
    };
    Command.Parameters.Add(parameter);
}

现在,这个ApplyRoles方法会引发异常:Application roles can only be activated at the ad hoc level.但如果我将ApplyRoles更改为此:

public bool ApplyRoles(string roleApp, string roleAppPassword)
{
   Command = new SqlCommand(string.Format("EXEC sp_setapprole '{0}', '{1}'", roleApp, roleAppPassword), Connection);
   bool ret = Command.ExecuteNonQuery() == -1;
   return ret;
}

该方法工作正常..所以我猜测问题出在AssignParam方法中。 问题是什么?我不想使用"工作"方法,因为我可以在它上面注入SQL。

1 个答案:

答案 0 :(得分:0)

sp_setapprole使用参数名称@rolename@password。如果要将参数名称传递给SqlCommand`实例,则必须使用这些参数名称。它在您的第二个示例中为您工作,因为您只按正确的顺序传递参数值,而存储过程期望它们。

由于您正在执行存储过程,请使用CommandType.StoredProcedure

还要把' @'参数名称前面的字符。

Command = new SqlCommand("sp_setapprole", Connection);
Command.CommandType = CommandType.StoredProcedure;
Command.Parameters.AddWithValue( @rolename, roleApp);
Command.Parameters.AddWithValue( @password, rolePassword);
bool ret = Command.ExecuteNonQuery() == -1;
     return ret;