Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 参数化SQL命令以更改包含的DB用户';密码_C#_Sql_Sql Server - Fatal编程技术网

C# 参数化SQL命令以更改包含的DB用户';密码

C# 参数化SQL命令以更改包含的DB用户';密码,c#,sql,sql-server,C#,Sql,Sql Server,我在SQL Server 2017中有一些包含的DB用户。在C#中,我试图执行SQL命令来更改这些用户中某个特定用户的密码。DB连接具有执行此操作的权限,并且不要求我知道用户的当前密码 var sqlStatement = $"ALTER USER {userName} WITH PASSWORD = '@Password';"; using (var cmd = new SqlCommand(sql, sqlConnection)) {

我在SQL Server 2017中有一些包含的DB用户。在C#中,我试图执行SQL命令来更改这些用户中某个特定用户的密码。DB连接具有执行此操作的权限,并且不要求我知道用户的当前密码

var sqlStatement = $"ALTER USER {userName} WITH PASSWORD = '@Password';";

        using (var cmd = new SqlCommand(sql, sqlConnection))
        {
            cmd.CommandType = CommandType.Text;
            //cmd.Parameters.Add("@UserName", SqlDbType.NVarChar).Value = userName;
            cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = password;

            var rowsAffected = cmd.ExecuteNonQuery();
        }
上面是我一直在使用的代码。对生成的内容运行跟踪将显示以下命令:

exec sp_executesql N'ALTER USER UserName1 WITH PASSWORD = ''@Password'';',N'@Password nvarchar(18)',@Password=N'Hqc5w7m98s4J!9'
这一点都不错误,事实上它似乎是有效的。但是当我尝试登录时(在更改密码之前,我可以很好地登录),我不能这样做。它似乎已更改密码,但未更改为我指定的密码。如果改为运行以下命令(C#中没有参数,只需构建字符串):


然后我现在可以用新密码再次登录。我似乎无法了解第一个案例中发生了什么?为什么它没有像我期望的那样更改密码?我尝试了它的一些变体,尝试使用参数使其工作,但没有成功。当然,我不想只使用无参数版本,但我已经花了大约5个小时来研究这个问题。

Alter User可能无法使用传统的参数化

string sqlStatement = @"
DECLARE @sql NVARCHAR(500)
SET @sql = 'ALTER USER UserName1 WITH PASSWORD= ' + QuoteName(@Password, '''') 
EXEC(@sql)";

using (var cmd = new SqlCommand(sqlStatement , sqlConnection))
{
    cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = password;
    // execute...
}

Alter User可能无法使用传统的参数化

string sqlStatement = @"
DECLARE @sql NVARCHAR(500)
SET @sql = 'ALTER USER UserName1 WITH PASSWORD= ' + QuoteName(@Password, '''') 
EXEC(@sql)";

using (var cmd = new SqlCommand(sqlStatement , sqlConnection))
{
    cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = password;
    // execute...
}

删除
“@Password”
周围的引号-您正在将密码设置为字符串
@Password
,而不是变量的值。@Larnu包含的用户有密码。错过了(我怎么不知道),谢谢您的更正@LukaszSzozda.@Diado您不能这样做,请获取错误
消息102,级别15,状态1,第11行“@Password”附近的语法不正确。
虽然您是对的,但它正在将密码更改为@Password。删除
“@Password”周围的引号可能重复。
-您将密码设置为字符串
@Password
,而不是变量的值。@Larnu包含的用户有密码。错过了这一点(我怎么不知道),谢谢你的更正@LukaszSzozda@Diado你不能这样做,在“@Password”附近出现错误
Msg 102,级别15,状态1,第11行不正确的语法。
虽然你是对的,但它正在将密码改为@Password。可能重复了
QUOTENAME
的出色用法。谢谢,这很有效,尽管我不得不在你周围加上括号在EXEC语句中添加
@sql
,以避免出现错误。是否有任何文档说明为什么传统的参数化不起作用?这是sql的一个错误,可能会得到解决吗?我相信这只是字符串文本的问题。
ALTER USER
命令在更改密码时需要单引号,但在引号围绕着一个
@param
,它没有被正确地替换。有点边缘化,但这样你仍然可以避免注入问题。非常好地使用了
QUOTENAME
。谢谢,这很有效,尽管我不得不在EXEC语句中的
@sql
周围加上括号以避免错误。有关于原因的文档吗传统的参数化不起作用了吗?这是SQL的一个缺陷,可以解决吗?我相信这只是字符串文本的问题。
ALTER USER
命令在更改密码时需要单引号,但是当引号围绕着
@param
时,它不会被正确地替换。一点边缘可以se,但这样仍然可以避免注射问题。