2010-10-16 78 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