【问题标题】:Handle single quote in SqlParameter in EXEC sp_setapprole?在 EXEC sp_setapprole 中处理 SqlParameter 中的单引号?
【发布时间】:2014-05-20 17:57:19
【问题描述】:

我有一个执行 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 注入。

【问题讨论】:

  • 我没有看到错误,但你为什么不使用调用 proc 的正常方式?省略 EXEC 的东西。
  • 你的意思是new SqlCommand("sp_setapprole", Connection)?但是当我设置AssignParam 方法时.NET 如何识别@roleApp@rolePassword
  • 你必须设置CommandType.StoredProcedure。请参阅下面我对您的根本问题的回答。

标签: c# winforms sqlcommand sqlparameter


【解决方案1】:

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;

【讨论】:

  • '@' 字符是必须的吗?因为我离开时没有 char 并且也可以工作。
  • 没必要,但我喜欢使用它,因为它更具可读性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
  • 1970-01-01
  • 2017-06-05
相关资源
最近更新 更多