Задать вопрос
DeepX
@DeepX

Как ввести пароль к базе данных MS Access из непечатных символов из кода на C#?

Доброго времени суток, уважаемые коллеги!
Помогите, пожалуйста. Столкнулся с не знакомой мне ранее проблемой.
Есть вполне себе работающая база MS Access, формата *.mdb, работающая с десктопным клиентом. Пароль на доступ к базе задан непечатными символами типа \u0127 \u0027 \u0087, и им подобными. Соответственно ввести их с клавиатуры невозможно - а можно только получить доступ программно, задав соответствующий пароль в параметрах подключения. Да, и в любом случае пароль менять нельзя.
Старый клиент был написан на Delphi, написан давно, но мне известна работающая функция, собирающая пароль для подключение к базе:

//получение пароля
function TDBAccess.GetDBPass: string;
begin
  Result := Chr(27) + Chr(8) + Chr(30) + Chr(23) +
 Chr(31) + Chr(22) + Chr(2) + Chr(24) + Chr(127);
end;


Сейчас клиент пишется на C#, там функции Chr() нет в принципе, и, соответственно, перекодировку символов и сборку строки пароля делаем вручную. Перепробовали кучу вариантов - не получается никак!
Вот основные варианты:
// строка подключения
DBConnection = new OleDbConnection();
DBConnection.ConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:Database Password={1};", _path, _pass);

Вариант#1.
string _pass = @"\u0027\u0008\u0030\u0023\u0031\u0022\u0002\u0024\u0127";

Вариант#2.
var _pass_char = Convert.ToChar(27) + Convert.ToChar(8) + Convert.ToChar(30) + Convert.ToChar(23) + Convert.ToChar(31) + Convert.ToChar(22) + Convert.ToChar(2) + Convert.ToChar(24) + Convert.ToChar(127);
String _pass= Encoding.Default.GetString(_pass_char);

Вариант#3.
var _pass_char =(char)27 + (char)8 + (char)30 + (char)23 + (char)31 + (char)22 + (char)2 + (char)24 + (char)127
String _pass= Encoding.Default.GetString(_pass_char);

Вариант#4.
byte[] _hex_code = new Byte[] { 0x1B, 0x08, 0x1E, 0x17, 0x1F, 0x16, 0x02, 0x18, 0x7F };
String _pass= Encoding.Unicode.GetString(_hex_code);

Соответственно поигрались со всеми вариантами кодовых страниц
var encoding = Encoding.GetEncoding(...)...
Но при открытии соединения:
An unhandled exception of type 'System.Data.OleDb.OleDbException' occurred in System.Data.dll

Additional information: Ошибочный пароль.
Или при некоторых CodePage сразу ругается на ошибочную строку подключения.

Подскажите, пожалуйста, кто знает! Может в мелочи какой дело, а мы "паримся".

Спасибо.
  • Вопрос задан
  • 840 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
DeepX
@DeepX Автор вопроса
Сам задал вопрос - сам отвечаю :)
Нужно так:
string _pass = Convert.ToChar(27).ToString() + Convert.ToChar(8)ToString() + Convert.ToChar(30)ToString() + Convert.ToChar(23)ToString() + Convert.ToChar(31)ToString() + Convert.ToChar(22)ToString() + Convert.ToChar(2)ToString() + Convert.ToChar(24)ToString() + Convert.ToChar(127)ToString();


Всё, как всегда, в мелочах...
Причём, я думал об этом способе, но отверг как чересчур простой и очевидный :) Оказывается для непечатных символов тоже подходит.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@dmitrievMV
Функция Chr конвертирует целое число IntValue или в AnsiChar или в WideChar


string _pass = Encoding.ASCII.GetString(new byte[] { 27, 8, 30, 23, 31, 22, 2, 24, 127 });
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы