Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];

Вниз

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

 
Александр_н   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.014 c
14-1132353545
lookin
2005-11-19 01:39
2005.12.18
Skype никто не хочет воспользоваться?


3-1130861942
zz 5
2005-11-01 19:19
2005.12.18
Создание инсталлятора Interbase


2-1133183927
kblc
2005-11-28 16:18
2005.12.18
TComboBox


2-1133258980
Malamba
2005-11-29 13:09
2005.12.18
трансформация строки в число ...


2-1133648336
Fl@sh
2005-12-04 01:18
2005.12.18
Rave Report + BD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский