Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > ADO, IB + MySQL, Firebird


Автор: Darked 17.3.2008, 22:51
       Доброе время суток.
  Задача: есть две СУБД - Firebird и MySQL. Нужно скопировать некоторые данные из двух таблиц Firebird(2.03) и поместить в одну, созданную таблицу в Mysql (версия 4.18 вроде). В Firebird стоит charset=none. Эти данные из MySQL потом будут выводиться на сайт средствами php. Возникает проблема - какого бы чарсет я не создавал бд на мускуле, русские символы туда переносятся крякозяблами... Кто - нибудь сталкивался с подобной необходимостью?
  Для коннекта к Firebird использую компоненты Interbase, к MySQL - ADO + driver ODBC 3.51.
  Код что - то типа:
Код

procedure TForm1.FormActivate(Sender: TObject);
begin
  adoConM.ConnectionString := 'Driver={MySQL ODBC 3.51 Driver};'
            +'Server=10.ххх.ххх.ххх;'
            +'Port=3306;'
            +'Database=Х;'
            +'User=Х;'
            +'Password=Х;Option=3;';

  adoConM.Connected := True;
  adoQry.Active := True;

  try
    dbUst.Connected := True;
  except
    ShowMessage('Ошибка при соединении с БД');
  end;
end;

procedure TForm1.btnCopyDataClick(Sender: TObject);
begin
 ibTrans.StartTransaction;
  ibQry.Close;
  ibQry.SQL.Clear;
  ibQry.SQL.Add('SELECT ...');
  ibQry.Open;

 while not ibQry.Eof do
    begin
      adoQry.Close;
      adoQry.SQL.Clear;
      adoQry.SQL.Add('INSERT INTO ...');
      adoQry.Parameters.ParamByName('a').Value := ibQry.FieldByName('A').AsInteger;
      adoQry.Parameters.ParamByName('b').Value := ibQry.FieldByName('B').AsInteger;
.
.
.
      adoQry.ExecSQL;

      ibQry.Next;
    end;

    ibTrans.Commit;
end;

   Причём написал скрипт копирования на php - никакх проблем не возникло при копировании в бд с сз1251.

Автор: Darked 19.3.2008, 06:48
   Попробовал коннектиться к другим базам MySQL, проблема с отображением русских символов при коннекте к любой базе MySQL.

Автор: Zmitro 19.3.2008, 09:10
Попробуйте в свойствах подключения к БД Firebird использовать в Connect Params: lc_ctype=WIN1251

Автор: Akella 19.3.2008, 09:28
А как именно ты переносишь?

Добавлено через 18 секунд
Цитата(Zmitro @  19.3.2008,  09:10 Найти цитируемый пост)
Попробуйте в свойствах подключения к БД Firebird использовать в Connect Params: lc_ctype=WIN1251 

ничё не получится

Добавлено через 48 секунд
ты пишешь программу или тебе единоразово нужно перенести?

Автор: Darked 19.3.2008, 14:22
Akella, 
    Переношу так: происходит коннект к обоим базам, в Firebird выборкой собираю нужные мне таблицы, поля. В запрос на вставку в MySQL в качество параметров adoQry.Parameters.ParamByName('a').Value := ibQry.FieldByName('A').AsInteger; подставляю нужные значения полей из сделанной выборки к Firebird, и так для каждой выбранной строки.
   Программа не разовая, так нужно будет делать периодически.

  
Zmitro,  к charset = NONE такой подход не подойдёт.

Автор: Akella 20.3.2008, 09:33
я уже делал подобное, попробуй всё выбирать в стринг грид или в ДБГрид, например, посмотри, как оно отображается.

Автор: Zmitro 21.3.2008, 09:31
как альтернатива но слегка геморная - выгружать из FB в файл и потом импортить. Можно сразу выгружать в sql файл insert-ами

Автор: Darked 26.3.2008, 09:17
Akella, что имеено выбрать?
  Те данные, которые я выбираю из FB в DbGrid'е отображаются нормально? в том - то и дело. 
  Проблема в отображении (и соотвественно записи) MySQL данных.
 

Zmitro, вариант, конечно, но... не, это не выход.

Автор: Darked 26.3.2008, 13:04
   Всем спасибо, проблема решена.
   Помогла посылка команды SET NAMES cp1251 после установления соединения!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)