2014-05-20 27 views
0

我有一个执行SqlCommand并将结果返回给winforms应用程序的方法。 我的方法是这样的:在EXEC sp_setapprole中处理SqlParameter中的单引号?

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注入。

+0

我没有看到错误,但为什么不使用正常的方法调用proc?退出'EXEC'的东西。 – usr

+0

你的意思是'新的SqlCommand(“sp_setapprole”,连接)'?但是当我设置'AssignParam'方法时.NET如何识别'@ roleApp'和'@ rolePassword'? –

+0

你必须设置'CommandType.StoredProcedure'。查看我的答案,下面是你的根本问题。 –

回答

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; 
+0

'@'字符是必需的?因为我离开了字符,也工作。 –

+1

没有必要,但我喜欢使用它,因为它更具可读性。 –