2010-10-16 81 views
0

我試圖執行創建一個給定的用戶名用戶(通過SQL參數)SQL Server中創建與參數(VB.net)USER

exec sp_executesql N'CREATE USER @LoginName 
         FOR LOGIN @LoginName;', 
        N'@LoginName varchar(5)', @LoginName='myuser' 

繼承人的代碼生成那上面:

Dim myCommand As SqlCommand = New SqlCommand("CREATE USER @LoginName 
               FOR LOGIN @LoginName;", 
              ClassDatabaseConnection.CustomInstance) 
myCommand.CommandType = CommandType.Text 
myCommand.Parameters.Add("@LoginName", SqlDbType.VarChar).Value = LoginName 
myCommand.ExecuteScalar() 

我得到和錯誤:

Incorrect syntax near '@LoginName'. 

我認爲這是由於爲varchar被傳遞的參數導致「MYUSER」,而比MyUser

我不能用sql參數來做這個嗎?

回答

2

您不能在Create User語句中使用參數。既然你已經在VB中,嘗試拼湊一個聲明。

Dim myCommand As SqlCommand = New SqlCommand("CREATE USER " + LoginName + 
               " FOR LOGIN " + LoginName + ";", 
              ClassDatabaseConnection.CustomInstance) 
myCommand.CommandType = CommandType.Text 
myCommand.ExecuteScalar() 
+1

我試圖避免這種情況,由於SQL注入。 – madlan 2010-10-16 19:09:48

+0

@madlan,請注意,但您可以在提交之前始終在您的登錄名中檢查錯誤字符。分號,引號和雙連字符是一個很好的起點。就我個人而言,我從來不會在用戶名中允許這些字符。 – Brad 2010-10-18 12:19:29

+0

好點布拉德,這是你的建議。 – madlan 2010-10-19 20:14:04

1

如上所述,您不能參數化CREATE LOGIN。

爲了避免SQL注入(也已註明),可以考慮使用SMO Login.Create

+1

我正在使用.net 4,因此目前無法使用SMO。 – madlan 2010-10-17 19:15:55

+0

您可以使用dmo for 2000.但是CREATE LOGIN或USER是SQL Server 2005+ – gbn 2010-10-17 19:18:36

+0

SMO似乎與2000(即連接到2000實例時使用SSM)相符。 – madlan 2010-10-17 19:20:31