2013-10-23 26 views
1

我有從代碼調用存儲過程的問題。OdbcCommand存儲過程

我的存儲過程:

ALTER PROCEDURE [dbo].[ChangePassword] 
    @param1 sysname, 
    @param2 sysname 

AS 
BEGIN 
DECLARE @sql nvarchar(500) 
SET @sql = 'ALTER LOGIN ' + @param1 + ' WITH PASSWORD = '''+ @param2 +''''; 
EXEC sp_executesql @sql 

END; 

當我運行這個從SQL編輯器工作正常,但是當我把這種從功能:

 using (var command = new OdbcCommand("{call ChangePassword(?,?)}", connection)) 
     { 
      try 
      { 
       command.CommandType = CommandType.StoredProcedure; 
       //command.Parameters.AddWithValue("@param1", user.Username); 
       //command.Parameters.AddWithValue("@param2", user.password); 

       command.Parameters.Add("@param1", OdbcType.VarChar, 50).Value = user.Username; 
       command.Parameters.Add("@param2", OdbcType.VarChar, 50).Value = user.password; 

       connection.Open(); 
       command.ExecuteNonQuery(); 
       connection.Close(); 
       return true; 
      } 

我收到錯誤

ERROR [42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near 'MYPASSWORD'. 

@param2附近

請有人可以幫助我。

我找到了辦法... :)

ALTER PROCEDURE [dbo].[ChangePassword] 
    @param1 sysname, 
    @param2 sysname 

AS 
BEGIN 
DECLARE @sql nvarchar(500) 
SET @sql = 'ALTER LOGIN ' + @param1 + ' WITH PASSWORD = '+ @param2 +''; 
EXEC sp_executesql @sql 

END; 

這些語法工作:)但現在當我從SQL編輯器中運行我有,我在以前的版本中存儲的函數調用時相同的錯誤程序。

有人可以解釋這一點嗎?

編輯

,最後要感謝馬克Gravell:

ALTER PROCEDURE [dbo].[ChangePassword] 
    @param1 sysname, 
    @param2 sysname 

AS 
BEGIN 
DECLARE @SQL nvarchar(4000) 

SET @SQL = N'ALTER LOGIN ' + QUOTENAME(@param1) + N' WITH PASSWORD = ' + QUOTENAME(@param2,''''); 
EXEC(@SQL); 

END; 

感謝

+0

爲什麼不使用雙引號並在裏面放單引號?喜歡 」'」 ? – Edper

+0

您能否告訴我們在使用SQL編輯器和C#時,您準確使用哪些值? – Tafari

+0

@JimRhodes也許這是他的密碼? – gleng

回答

0

我想登錄應該有雙引號(')也..

'ALTER LOGIN ''' + @param1 + ''' WITH PASSWORD = '''+ @param2 +''''; 
+0

問題中,「alter login 」不接受名稱作爲字符串或參數 - 它必須是直接對象名稱(與表格一樣) –

+0

嘗試打印(@sql)並查看輸出是什麼。所以你可以調試它 – Izikon

+0

我看到的答案: 更改登錄yoursqllogin WITH PASSWORD ='newpassword'OLD_PASSWORD ='oldpassword' – Izikon

0

這裏你需要使用不同逃生規則的混合體;該用戶名需要被[]轉義,並且該密碼需要被'轉義;在這種情況下都不能參數化。幸運的是,QUOTENAME幫助我們在這裏,例如:

-- this is just for example; this could be sp parameters etc 
declare @username sysname = 'ab;drop table users;--', 
     @password sysname = 'mwah''a''haha'; 

declare @sql nvarchar(4000) = N'alter login ' + QUOTENAME(@username) 
    + N' with password = ' + QUOTENAME(@password, ''''); 

exec(@sql); 

注:我要指出,這似乎是一個要求非常奇怪;我想對可能的輸入進行一些消毒處理,特別是個人使用(特別是用戶名)。