none
Кодировка (РУ) старой Paradox и работа с базой WinForms RRS feed

  • Вопрос

  • Привет! Второй день мучаюсь с базой данных Paradox.

    Есть некоторое старое ПО и Девайс, который работает на базе Paradox. И если с подключением и чтением данных я более-менее справился (хотя, вру - не разобрался как читать таблицы под паролем - не знаю в каком месте в строке подключения прописать пароль, приходится через IDE снимать пароль с базы пока-что для работы).

    То вот распознать что написано в таблице - совсем плохо =).

    Выложу пару скриншотов - подскажите пожалуйста, как пере конвертировать в читаемый вид текст.

    1. DataGrid с вычитанными данными из базы.

    http://dl.dropbox.com/u/22639368/delete/paradox1.PNG

    2. Свойство таблицы из "родной" IDE - видно установленный тип кодировки + версию БД (вроде это версия вверху, вообще версия - 7, мб это версия формата таблицы).

    http://dl.dropbox.com/u/22639368/delete/paradox2.PNG

    Строка подключения:

    OleDbConnection _connection = new OleDbConnection();
    StringBuilder ConnectionString = new StringBuilder("");
    ConnectionString.Append(@"Provider=Microsoft.Jet.OLEDB.4.0;");
    ConnectionString.Append(@"Extended Properties=Paradox 7.x;");
    ConnectionString.Append(@"Data Source=C:\NMENU\;");
    //ConnectionString.Append(@"CollatingSequence = ASCII;");
                
    //ConnectionString.Append(@"Mode=ReadWrite;");
    ConnectionString.Append(@"Mode=1;");          
    //ConnectionString.Append(@"PWD=jIGGAe;");
     _connection.ConnectionString = ConnectionString.ToString();
    Есть еще вариант использовать Microsoft Paradox Driver, но я что-то не разобрался как заставить его работать =(




    14 апреля 2012 г. 11:10

Ответы

  • Кухня (слово)

    202 243 245 237 255 <= такие коды при чтение из базы (ToString()=>ByteArr=>(int)[i]=>[i].ToString())
    69, 111, 111, 105, 121 <= такие коды при Encoding.GetEncoding(1251).GetBytes()

    Согласно таблице кодов, http://www.bombina.com/t5_ascii.htm, верхние коды русских символов - отлично подходят. Нижние мусор.

    Я наверное не так работаю с перекодированием?

    Ну да ладно, как прочесть русские буквы я уже понял. А как подключится к базе, используя пароль? =)


    14 апреля 2012 г. 17:56
  • Ох. Сложно копаться в прошлом =)

    В общем, может быть кому ни будь понадобится.

    0. Пункт, скорее всего, необязательный. Но я это делал, и поэтому если что-то не заработает - попробуйте =). Сейчас очень лень проверять это на чистой ОС. Устанавливаем BDE (Borland Database Engine 5.01) . Настраиваем Configurations => Drivers Native => Paradox. Net Dir - папка с базой, landdriver=ascii. Остальное не менял.

    1. C:\Winnt\System32\regsvr32.exe   Mspbde40.dll (поищите, должна быть в system32), собственно, подключение через JET заработало только после этого действия.

    2. connection string.

    Отладочная версия. Легко комментировать\изменять было. Не используйте StringBuilder в реальной работе так =)

    Обратите внимание, что пароль прописывается в Extended Properties. Все, что находится в Extended Properties должно быть заключено в кавычки.

     OleDbConnection _connection = new OleDbConnection();
                StringBuilder ConnectionString = new StringBuilder("");
                ConnectionString.Append(@"Provider=Microsoft.Jet.OLEDB.4.0;");
                ConnectionString.Append("Extended Properties=\"Paradox 7.X;PWD=jIGGAe;\";Mode=Read|Write|Share Deny None;Persist Security Info=True;");
                ConnectionString.Append(@"Data Source=C:\NMENU\;");
                ConnectionString.Append(@"Mode=ReadWrite;");
                _connection.ConnectionString = ConnectionString.ToString();
                try
                {
                    _connection.Open();
    
                    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM menu;", _connection);
    
                    DataSet dsRetrievedData = new DataSet();
    
                    da.Fill(dsRetrievedData);
    
                    var sb = new StringBuilder();
    
                    string s = dsRetrievedData.GetXml();
    
                    this.dataGridView1.DataSource = dsRetrievedData;
                    this.dataGridView1.DataMember = dsRetrievedData.Tables[0].TableName;
                }
                catch (Exception e)
                {
                    MessageBox.Show("Error openning database! " + e.Message + "\r\n" + e.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

    3. А с кодировкой я не очень разобрался. Поэтому, если кто подскажет, что я не так сделал - скажу спасибо =). А пока сделаю "топорным" способом =)

    да, забыл - все это на хп =).

    • Изменено Dmytro Bondarenko 14 апреля 2012 г. 21:25 добавил про ОС
    • Помечено в качестве ответа Dmytro Bondarenko 14 апреля 2012 г. 21:36
    14 апреля 2012 г. 18:51
  • добавлю, как перегнать из windows-1251 to unicode

     private string ConvertToUtf(string source)
            {
                Encoding srcEncodingFormat = Encoding.GetEncoding("windows-1252");
                byte[] originalByteString = srcEncodingFormat.GetBytes(source);
                return Encoding.Default.GetString(originalByteString);
            }
    вот теперь точно все =)
    • Помечено в качестве ответа Dmytro Bondarenko 17 апреля 2012 г. 7:20
    17 апреля 2012 г. 7:20

Все ответы

  • Кухня (слово)

    202 243 245 237 255 <= такие коды при чтение из базы (ToString()=>ByteArr=>(int)[i]=>[i].ToString())
    69, 111, 111, 105, 121 <= такие коды при Encoding.GetEncoding(1251).GetBytes()

    Согласно таблице кодов, http://www.bombina.com/t5_ascii.htm, верхние коды русских символов - отлично подходят. Нижние мусор.

    Я наверное не так работаю с перекодированием?

    Ну да ладно, как прочесть русские буквы я уже понял. А как подключится к базе, используя пароль? =)


    14 апреля 2012 г. 17:56
  • Ох. Сложно копаться в прошлом =)

    В общем, может быть кому ни будь понадобится.

    0. Пункт, скорее всего, необязательный. Но я это делал, и поэтому если что-то не заработает - попробуйте =). Сейчас очень лень проверять это на чистой ОС. Устанавливаем BDE (Borland Database Engine 5.01) . Настраиваем Configurations => Drivers Native => Paradox. Net Dir - папка с базой, landdriver=ascii. Остальное не менял.

    1. C:\Winnt\System32\regsvr32.exe   Mspbde40.dll (поищите, должна быть в system32), собственно, подключение через JET заработало только после этого действия.

    2. connection string.

    Отладочная версия. Легко комментировать\изменять было. Не используйте StringBuilder в реальной работе так =)

    Обратите внимание, что пароль прописывается в Extended Properties. Все, что находится в Extended Properties должно быть заключено в кавычки.

     OleDbConnection _connection = new OleDbConnection();
                StringBuilder ConnectionString = new StringBuilder("");
                ConnectionString.Append(@"Provider=Microsoft.Jet.OLEDB.4.0;");
                ConnectionString.Append("Extended Properties=\"Paradox 7.X;PWD=jIGGAe;\";Mode=Read|Write|Share Deny None;Persist Security Info=True;");
                ConnectionString.Append(@"Data Source=C:\NMENU\;");
                ConnectionString.Append(@"Mode=ReadWrite;");
                _connection.ConnectionString = ConnectionString.ToString();
                try
                {
                    _connection.Open();
    
                    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM menu;", _connection);
    
                    DataSet dsRetrievedData = new DataSet();
    
                    da.Fill(dsRetrievedData);
    
                    var sb = new StringBuilder();
    
                    string s = dsRetrievedData.GetXml();
    
                    this.dataGridView1.DataSource = dsRetrievedData;
                    this.dataGridView1.DataMember = dsRetrievedData.Tables[0].TableName;
                }
                catch (Exception e)
                {
                    MessageBox.Show("Error openning database! " + e.Message + "\r\n" + e.StackTrace, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return false;
                }

    3. А с кодировкой я не очень разобрался. Поэтому, если кто подскажет, что я не так сделал - скажу спасибо =). А пока сделаю "топорным" способом =)

    да, забыл - все это на хп =).

    • Изменено Dmytro Bondarenko 14 апреля 2012 г. 21:25 добавил про ОС
    • Помечено в качестве ответа Dmytro Bondarenko 14 апреля 2012 г. 21:36
    14 апреля 2012 г. 18:51
  • Спасибо что выложили решение проблемы, оно будет полезным для тех кто еще столкнется с данной проблемой.


    Для связи [mail]

    16 апреля 2012 г. 6:40
  • добавлю, как перегнать из windows-1251 to unicode

     private string ConvertToUtf(string source)
            {
                Encoding srcEncodingFormat = Encoding.GetEncoding("windows-1252");
                byte[] originalByteString = srcEncodingFormat.GetBytes(source);
                return Encoding.Default.GetString(originalByteString);
            }
    вот теперь точно все =)
    • Помечено в качестве ответа Dmytro Bondarenko 17 апреля 2012 г. 7:20
    17 апреля 2012 г. 7:20