OdbcCommand存储过程

时间:2013-10-23 13:43:12

标签: c# sql sql-server stored-procedures

我从代码调用存储过程时遇到问题。

我的存储过程:

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编辑器运行时,我遇到了与以前版本的存储过程中的函数调用时相同的错误。

有人可以解释一下吗?

修改

决赛归功于Marc 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;

由于

2 个答案:

答案 0 :(得分:0)

我认为登录应该有双倍(')..

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

答案 1 :(得分: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);

注意:我应该注意,这似乎是一个奇怪的要求;我想要对可能的输入进行一点消毒,个人(特别是用户名)。