2011-08-25 18 views

回答

8

呼叫sp_addlogin代替 - 它已經參數

+0

這裏沒有聲明這是T-SQL方言實際上... – Tigran

+0

好點。有沒有其他'SQL'產品使用相同的語法來創建登錄? – kenwarner

+0

好的,我可以這樣做。現在我正面臨另一個問題 - 我需要創建數據庫。 CREATE DATABASE似乎也不可能被參數化。 – Olga

0

下面是如何參數的SQL。您可能還想查看處理這類事情的this article on writing a DAO。我不確定您是否可以參數化LoginName。你可能最好是像以前的海報所說的那樣調用sp_addlogin。

 command.CommandText= @"CREATE LOGIN @LoginName WITH [email protected]"; 
     command.CommandType = CommandType.Text; 
     command.Parameters.Add(new SqlParameter() 
      { 
       ParameterName = "@LoginName", 
       Value = "MyLoginNameValue", 
       SqlDbType = SqlDbType.NVarChar, 
       Size = 50 
      }); 
     command.Parameters.Add(new SqlParameter() 
      { 
       ParameterName = "@Password", 
       Value = "MyPasswordValue", 
       SqlDbType = SqlDbType.NVarChar, 
       Size = 50 
      }); 
+1

不,這不起作用 - 它會拋出一個異常「@LoginName附近語法不正確」。 – Olga

-1

可以嘗試這樣的事:

SqlCommand cmd = new SqlCommand(
       "CREATE LOGIN @login WITH [email protected]", conn); 
SqlParameter param = new SqlParameter(); 
param.ParameterName = "@login "; 
param.Value   = usertextforlogin; 
cmd.Parameters.Add(param); 

param = new SqlParameter(); 
param.ParameterName = "@pwd"; 
param.Value   = usertextforpwd; 

cmd.Parameters.Add(param); 
+0

@downvoter:謹慎解釋? – Tigran

+0

您無法在T-SQL中參數化對象名稱,並且「CREATE LOGIN」語句使用對象名稱,而不是其參數的字符串/文本值。 – Dai

0

好像要做到這一點是使用SQL Server SMO SDK最正確的方式。我不關心任何其他SQL引擎,因爲我們絕對不會從SQL Server遷移。

0

您可以通過在exec包裝你的DDL查詢參數,例如查詢如下:

command.CommandText = "exec ('CREATE DATABASE ' + @DB)"

如果再(至少在T-SQL)添加參數@DB照常這應該工作。

應該有可能以相同的方式使用CREATE LOGIN

+0

最終字符串連接仍在執行中,只是在數據庫引擎內部,所以我沒有看到這會如何緩解注入(例如'@DB ='\'1 = 1'') – Dai