2013-03-26 1 views
0

Этот код C# просто не хочет изменять пароль на сервере (для UserID и PW, очевидно, будут строки для какой-либо цели, но это только для того, чтобы заставить его работать):Подключение SQL Server для ALTER LOGIN C# .net

SqlConnection conn = new SqlConnection ("Data Source=ServerIP;Persist Security Info=False;User ID=UserID;Password=UserPW"); 
SqlCommand cmd = new SqlCommand ("ALTER LOGIN UserID WITH PASSWORD='NewPW' OLD_PASSWORD='UserPW'", conn); 
cmd.CommandType = CommandType.Text; 
conn.Open(); 
conn.Close(); 

Изменение пароля с помощью тех же команд ALTER LOGIN UserID WITH PASSWORD='NewPW' OLD_PASSWORD='UserPW' со студией управления сервером работает как шарм, так что нет никаких проблем в командной строке и/или разрешений для данного конкретного пользователя. Думаю, я пропустил что-то в Sql Connection line. Уже пробовали комбинации:

Initial Catalog=master; 
Initial Catalog=; 
Integrated Security=SSPI; 
Persist Security Info=True; 

Изменение типа команды, используя ExecuteNonQuery();, и многое другое, но ничего не похоже на работу.

«Google» не дает никакого ценного результата, надеюсь, что я найду здесь свой ответ, спасибо, что забрал ваше время заранее.

ответ

1

Попробуйте следующее, работает удовольствие для меня:

SqlConnection conn = new SqlConnection ("Data Source=ServerIP;Persist Security Info=False;User ID=UserID;Password=UserPW"); 
SqlCommand cmd = new SqlCommand ("ALTER LOGIN UserID WITH PASSWORD='NewPW' OLD_PASSWORD='UserPW'", conn); 
cmd.CommandType = CommandType.Text; 
conn.Open(); 
cmd.ExecuteNonQuery(); 
conn.Close(); 

Вы забыли поставить cmd.ExecuteNonQuery() после открыли соединение. Я только что протестировал это, и он успешно изменил пароль в моей локальной базе данных.

+0

Я упоминал об этом в своем первоначальном посте, так или иначе, он работает именно так. Кажется, что проблема была на стороне сервера, и как-то фиксировал ее. – Alt

1
string queryString = @"DECLARE @sql NVARCHAR(500) 
       SET @sql = 'ALTER LOGIN ' + QuoteName(@loginName) + 
        ' WITH PASSWORD= ' + QuoteName(@password, '''') 
       EXEC @sql "; 

using (var connection = new SqlConnection(connectionString)) 
{ 
    var command = new SqlCommand(queryString, connection); 
    command.Parameters.AddWithValue("@loginName", loginName); 
    command.Parameters.AddWithValue("@password", password); 

    connection.Open(); 
    command.ExecuteNonQuery() 
} 

UPDATE

С DDL (язык определения данных) отчетности (как ALTER LOGIN) вы не можете использовать параметры непосредственно. Вот почему я использую динамический SQL.

QuoteName будет делать правильное цитирование в SQL, просто удваивает любые символы (первый вызов) или символы (второй вызов).

+0

-2: 'Quotename' предназначен для возврата имен объектов по правильной котировке, а создание динамического SQL без причины открывает его для SQL-инъекции. – cjk

+0

Где вы видите SQL Injection здесь? –

+0

OK Я возвращаю SQL-инъекцию, но почему бы просто не пройти в параметрах без всей конструкции и выполнить SQL? Вот в чем их смысл. – cjk

Смежные вопросы