处理EXEC sp_setapprole中SqlParameter的单引号
本文关键字:SqlParameter 单引号 setapprole EXEC sp 处理 | 更新日期: 2023-09-27 18:04:12
我有一个执行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注入。
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;