Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.12.18;
Скачать: CL | DM;

Вниз

Создание базы даннх программным путём   Найти похожие ветки 

 
Александр_н   (2005-10-27 14:58) [0]

Задача: перенести данные из таблиц базы данных на Oracle в таблицы базы данных InterBase. База данных InterBase и все таблицы должны создаваться программным путём, считывая информацию из базы данных Oracle.
Не удаётся при создании базы InterBase с помощью компонента IBDataBase установить национальную кодировку WIN1251. Как только указываю IBDataBase1.Params.Add("DEFAULT CHARACTER SET WIN1251"), так программа завершается с ошибкой. Прочие параметры (SIZE,USER,PASSWORD) принимаются. И как задать порядок сортировки PXW_CYRL, если информацию о типе столбца и его размерности я получаю из базы данных Oracle. Спасибо.


 
Johnmen ©   (2005-10-27 15:21) [1]

TIBDatabase.CreateDatabase+F1 ?

Ошибка секретная?

См. COLLATE


 
Александр_н   (2005-10-27 16:32) [2]

Спасибо Johnmen, но я, возможно чего-то не понял или плохо объяснил. В IBConsole я прекрасно могу создать нужные мне таблицы с необходимой кодировкой и порядком сортировки, но сделать мне надо это в своей программе. Делаю я это так:
IBDataBase1.Params.Add("USER ""+Trim(CreateBase.Edit2.Text)+""");
IBDataBase1.Params.Add("PASSWORD ""+Trim(CreateBase.Password.Text)+""");
IBDataBase1.Params.Add("PAGE_SIZE "+Trim(CreateBase.ComboBox1.Text));
//IBDataBase1.Params.Add("DEFAULT CHARACTER SET WIN1251");
IBDataBase1.SQLDialect:=3;
IBDataBase1.CreateDatabase;
Из TIBDatabase.CreateDatabase+F1 следует, что национальную кодировку на этапе созданя базы данных вводить не надо:
1. Set the database name to the drive, path, and filename of the database file.
2. Set Params to the parameter for the CREATE DATABASE statement:
USER "SYSDBA"
PASSWORD "masterkey"
PAGE_SIZE 4096
3. Set the SQLDialect value.
4. Call the CreateDatabase method.
А мне это необходимо для дальнейшей перекачке данных из Oracle. Вот я и спрашиваю - как это обойти. Спасибо.


 
Sergey13 ©   (2005-10-27 16:42) [3]

2Александр_н   (27.10.05 14:58)
Это разовая задача или универвальный перегонщик из Оракла в ИБ?


 
Johnmen ©   (2005-10-27 16:57) [4]

>Александр_н   (27.10.05 16:32) [2]

1. Кавычки для имени и пароля д.б одинарными, т.е. Add("USER """+Trim(CreateBase.Edit2.Text)+"""");
2. Add("DEFAULT CHARACTER SET WIN1251");  совершенно законно.
3. Не вижу задания имени БД.


 
Александр_н   (2005-10-27 17:36) [5]

Sergey13. Задача скорее разовая, но таблиц в базе десятки и если каждую создавать вручную... Хотя можно рассмотреть как универсальный перегонщик и не только из Oracle.
Johnmen. Имя базы данных задаю. Просто не указал. А за кавычки - СПАСИБО. Заработало. Но возник новый вопрос. Таблица создалась и загрузилась данными. IBConsole её видит (структуру и данные), но не видит Inteactive SQL, т.е. в ответ на запрос select count(*) table_name получаю ответ Table unknown table_name. Причём если в базе создаю другую таблицу из ISQL, то к ней тот же запрос проходит. В чём может быть проблема? Спасибо.


 
Johnmen ©   (2005-10-27 17:43) [6]

В кешировании метаданных.
Перед выполнением DML запросов (после DDL) неплохо бы пересоединиться с БД.


 
Sergey13 ©   (2005-10-28 09:26) [7]

2[5] Александр_н   (27.10.05 17:36)
>Задача скорее разовая, но таблиц в базе десятки и если каждую создавать вручную
Я бы на твоем месте воспользовался набором из трех программ. TOAD + NotePad + IBExpres.


 
Виталий Панасенко   (2005-10-28 10:19) [8]

Вообще-то все это можно было бы попробовать перегнать DataPump/IBDataPump...И не изобретать велосипед...


 
Sergey13 ©   (2005-10-28 10:28) [9]

2[8] Виталий Панасенко   (28.10.05 10:19)
У него пока проблемма с метаданными, как я понял.

Поправка к [7] Sergey13 ©   (28.10.05 09:26)
> + IBExpres.
IB Expert конечно.


 
Александр_н   (2005-10-28 10:59) [10]

Вопрос остался. Какое может быть кэширование если компьютер был полностью перезагружен, но ситуация повторяется IBConsole созданную таблицу видит (структуру и данные), но не видит Inteactive SQL, т.е. в ответ на запрос select count(*) table_name получаю ответ Table unknown table_name.


 
Johnmen ©   (2005-10-28 11:04) [11]

Чёткую последовательность действий приводи.


 
Desdechado ©   (2005-10-28 11:06) [12]

вполне может не хватать прав на таблицу


 
Zacho ©   (2005-10-28 11:16) [13]

Александр_н   (28.10.05 10:59) [10]

Приведи DDL создания таблицы, и запрос которым ты пытаешься к ней обратиться.
Сильно подозреваю, что ты создал таблицу с case-sensetive именем.

P.S. Выкини IBConsole, используй IBExpert.


 
Sergey13 ©   (2005-10-28 11:22) [14]

2[10] Александр_н   (28.10.05 10:59)
А если все это прокрутить через ErWin? Вообще только кнопки нажимай. 8-)


 
Александр_н   (2005-10-28 11:25) [15]

После создания базы данных создаю таблицу
IBTable1.Active:=False;
IBTable1.TableName:="table_name";
if not IBTable1.Exists then
 begin
 with IBTable1.FieldDefs do
   begin
   Clear;
   for i:=0 to ListBox2.Items.Count-1 do
   with AddFieldDef do
     begin
     Name:=ListBox2.Items[i];
     if OraQuery1.FieldByName(ListBox2.Items[i]).DataType=ftFloat then
       DataType:=ftInteger
     else
       DataType:=OraQuery1.FieldByName(ListBox2.Items[i]).DataType;
     Size:=OraQuery1.FieldByName(ListBox2.Items[i]).Size;
     Required:=OraQuery1.FieldByName(ListBox2.Items[i]).Required;
     end;
   end;
   with IBTable1.IndexDefs do
     begin
     Clear;
     with AddIndexDef do
       begin
       Name := "";
       Fields :=ListBox2.Items[ListBox2.ItemIndex];
       Options := [ixPrimary];
       end;
     end;
 IBTable1.CreateTable;
 end;
В ListBox2 у меня находится список имён полей (частично или все) из таблицы БД Oracle. Затем формирую запрос и
OraQuery1.Open;
OraQuery1.First;
IBTable1.Close;
IBTable1.Database:=IBDataBase1;
IBTable1.TableName:="table_name";
IBTable1.Open;
while not OraQuery1.Eof do
 begin
 IBTable1.Insert;
 for i:=0 to IBTable1.Fields.Count-1 do
 IBTable1.Fields[i].Value:=OraQuery1.FieldByName(IBTable1.Fields[i].FieldName).Value;
 IBTable1.Post;
 OraQuery1.Next;
 end;
IBTable1.Close;


 
Desdechado ©   (2005-10-28 11:27) [16]

> Сильно подозреваю, что ты создал таблицу с case-sensetive именем.
Да, в 3 диалекте такое многих в тупик ставит.


 
Johnmen ©   (2005-10-28 11:28) [17]

Э-э-э...
А причём тут
Александр_н   (28.10.05 10:59) [10]
Вопрос остался. Какое может быть кэширование если компьютер был полностью перезагружен, но ситуация повторяется IBConsole созданную таблицу видит (структуру и данные), но не видит Inteactive SQL, т.е. в ответ на запрос select count(*) table_name получаю ответ Table unknown table_name.

?

Мы вообще о чём???


 
Zacho ©   (2005-10-28 11:30) [18]

Александр_н   (28.10.05 11:25) [15]

Зачем тебе такие заморочки с TIBTable ?
Используй TIBSQL и запрос CREATE TABLE ... гораздо проще, и код понятнее будет.


 
Александр_н   (2005-11-01 11:30) [19]

1. Таблица создалась и загрузилась данными. IBConsole её видит (структуру и данные), но не видит Inteactive SQL, т.е. в ответ на запрос select count(*) table_name получаю ответ Table unknown table_name. Причём если в базе создаю другую таблицу из ISQL, то к ней тот же запрос проходит.  Обнаружил, что, если запрос представить в виде  select count(*) "table_name", то он выполняется. В чём может быть проблема?
2. Подскажите как получить имя поля, по которому построен ключ (PRIMARY KEY), если подключаешься к таблице, структуру которой не знаешь.
3. Перекачиваю таблицу как указано ниже:
OraQuery1.Close;
OraQuery1.SQL.Clear;
OraQuery1.SQL.Add("select * from table_name");
OraQuery1.Open;
OraQuery1.First;
IBTable1.Close;
IBTable1.Database:=IBDataBase1;
IBTable1.TableName:="table_name";
IBTable1.Open;
while not OraQuery1.Eof do
begin
IBTable1.Insert;
for i:=0 to IBTable1.Fields.Count-1 do
IBTable1.Fields[i].Value:=OraQuery1.FieldByName(IBTable1.Fields[i].FieldName).Value;
IBTable1.Post;
IBTransaction1.CommitRetaining;
OraQuery1.Next;
end;
но где-то после закачки 33000 записей получаю ошибку Out of memory. Что я сделал не так?
Спасибо.


 
s999   (2005-11-01 12:29) [20]


> Что я сделал не так?
> Спасибо.


Тебе уже ответили:

1. Читай про диалекты IB.
2. IBTable кэширует все на клиенте, используй IBSQL.


 
Курдль ©   (2005-11-01 12:37) [21]


> Задача: перенести данные из таблиц базы данных на Oracle
> в таблицы базы данных InterBase. База данных InterBase и
> все таблицы должны создаваться программным путём, считывая
> информацию из базы данных Oracle.


А почему так замысловато? Неужели не сохранилось ни физической модели БД, ни хотя бы концептуальной?
Но если даже так, всегда можно произвести "reverse enginiring" существующей базы в физическую модель. Тогда будут получены не только таблицы, но и все связи, чеки, и даже серверная логика. А потом можно сгенерить скрипт для создания новой базы для известных CASE-инструменту СУБД.


 
Zacho ©   (2005-11-01 18:11) [22]

Александр_н   (01.11.05 11:30) [19]
Обнаружил, что, если запрос представить в виде  select count(*) "table_name", то он выполняется. В чём может быть проблема?


Читай про правила именования метаданных в диалекте 3. В стандартной документации по IB и на http://www.ibase.ru/develop.htm Точные ссылки не помню, искать мне лень, но думаю что ты не дурак и сам найдёшь :)

> Подскажите как получить имя поля, по которому построен
> ключ (PRIMARY KEY), если подключаешься к таблице,
> структуру которой не знаешь.

Читай Language Reference, главу "System tables and views"

> но где-то после закачки 33000 записей получаю ошибку
> Out of memory. Что я сделал не так?

Память кончилась... RTFM TIBTable.UniDirectional, и http://www.ibase.ru/devinfo/client.htm



Страницы: 1 вся ветка

Текущий архив: 2005.12.18;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.055 c
2-1133260791
nickmas
2005-11-29 13:39
2005.12.18
Компонент TabControl


14-1132938352
Fl@sh
2005-11-25 20:05
2005.12.18
Приглашение в Украину!!


14-1133114971
Kerk
2005-11-27 21:09
2005.12.18
Pazitron_Brain, поздравляю!


10-1109505053
Port 111
2005-02-27 14:50
2005.12.18
Работа с Word по шаблонам


14-1132920637
Patient
2005-11-25 15:10
2005.12.18
Насморк - это хорошо или плохо?