2014-05-20 26 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

沒有必要,但我喜歡使用它,因爲它更具可讀性。 –