![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание базы даннх программным путём [D6, IB6.x]
Александр_н © (2005-10-27 14:58:00)Задача: перенести данные из таблиц базы данных на Oracle в таблицы базы данных InterBase. База данных InterBase и все таблицы должны создаваться программным путём, считывая информацию из базы данных Oracle.
Не удаётся при создании базы InterBase с помощью компонента IBDataBase установить национальную кодировку WIN1251. Как только указываю IBDataBase1.Params.Add('DEFAULT CHARACTER SET WIN1251'), так программа завершается с ошибкой. Прочие параметры (SIZE,USER,PASSWORD) принимаются. И как задать порядок сортировки PXW_CYRL, если информацию о типе столбца и его размерности я получаю из базы данных Oracle. Спасибо.
Zacho (2005-11-01 18:11:00) [1]Александр_н (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
Курдль (2005-11-01 12:37:00) [2]
> Задача: перенести данные из таблиц базы данных на Oracle
> в таблицы базы данных InterBase. База данных InterBase и
> все таблицы должны создаваться программным путём, считывая
> информацию из базы данных Oracle.
А почему так замысловато? Неужели не сохранилось ни физической модели БД, ни хотя бы концептуальной?
Но если даже так, всегда можно произвести "reverse enginiring" существующей базы в физическую модель. Тогда будут получены не только таблицы, но и все связи, чеки, и даже серверная логика. А потом можно сгенерить скрипт для создания новой базы для известных CASE-инструменту СУБД.
s999 (2005-11-01 12:29:00) [3]
> Что я сделал не так?
> Спасибо.
Тебе уже ответили:
1. Читай про диалекты IB.
2. IBTable кэширует все на клиенте, используй IBSQL.
Александр_н (2005-11-01 11:30:00) [4]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. Что я сделал не так?
Спасибо.
Zacho (2005-10-28 11:30:00) [5]Александр_н (28.10.05 11:25) [15]
Зачем тебе такие заморочки с TIBTable ?
Используй TIBSQL и запрос CREATE TABLE ... гораздо проще, и код понятнее будет.
Johnmen (2005-10-28 11:28:00) [6]Э-э-э...
А причём тут
Александр_н (28.10.05 10:59) [10]
Вопрос остался. Какое может быть кэширование если компьютер был полностью перезагружен, но ситуация повторяется IBConsole созданную таблицу видит (структуру и данные), но не видит Inteactive SQL, т.е. в ответ на запрос select count(*) table_name получаю ответ Table unknown table_name.
?
Мы вообще о чём???
Desdechado (2005-10-28 11:27:00) [7]> Сильно подозреваю, что ты создал таблицу с case-sensetive именем.
Да, в 3 диалекте такое многих в тупик ставит.
Александр_н (2005-10-28 11:25:00) [8]После создания базы данных создаю таблицу
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;
Sergey13 (2005-10-28 11:22:00) [9]2[10] Александр_н (28.10.05 10:59)
А если все это прокрутить через ErWin? Вообще только кнопки нажимай. 8-)
Zacho (2005-10-28 11:16:00) [10]Александр_н (28.10.05 10:59) [10]
Приведи DDL создания таблицы, и запрос которым ты пытаешься к ней обратиться.
Сильно подозреваю, что ты создал таблицу с case-sensetive именем.
P.S. Выкини IBConsole, используй IBExpert.
Desdechado (2005-10-28 11:06:00) [11]вполне может не хватать прав на таблицу
Johnmen (2005-10-28 11:04:00) [12]Чёткую последовательность действий приводи.
Александр_н (2005-10-28 10:59:00) [13]Вопрос остался. Какое может быть кэширование если компьютер был полностью перезагружен, но ситуация повторяется IBConsole созданную таблицу видит (структуру и данные), но не видит Inteactive SQL, т.е. в ответ на запрос select count(*) table_name получаю ответ Table unknown table_name.
Sergey13 (2005-10-28 10:28:00) [14]2[8] Виталий Панасенко (28.10.05 10:19)
У него пока проблемма с метаданными, как я понял.
Поправка к [7] Sergey13 © (28.10.05 09:26)
> + IBExpres.
IB Expert конечно.
Виталий Панасенко (2005-10-28 10:19:00) [15]Вообще-то все это можно было бы попробовать перегнать DataPump/IBDataPump...И не изобретать велосипед...
Sergey13 (2005-10-28 09:26:00) [16]2[5] Александр_н (27.10.05 17:36)
>Задача скорее разовая, но таблиц в базе десятки и если каждую создавать вручную
Я бы на твоем месте воспользовался набором из трех программ. TOAD + NotePad + IBExpres.
Johnmen (2005-10-27 17:43:00) [17]В кешировании метаданных.
Перед выполнением DML запросов (после DDL) неплохо бы пересоединиться с БД.
Александр_н (2005-10-27 17:36:00) [18]Sergey13. Задача скорее разовая, но таблиц в базе десятки и если каждую создавать вручную... Хотя можно рассмотреть как универсальный перегонщик и не только из Oracle.
Johnmen. Имя базы данных задаю. Просто не указал. А за кавычки - СПАСИБО. Заработало. Но возник новый вопрос. Таблица создалась и загрузилась данными. IBConsole её видит (структуру и данные), но не видит Inteactive SQL, т.е. в ответ на запрос select count(*) table_name получаю ответ Table unknown table_name. Причём если в базе создаю другую таблицу из ISQL, то к ней тот же запрос проходит. В чём может быть проблема? Спасибо.
Johnmen (2005-10-27 16:57:00) [19]>Александр_н (27.10.05 16:32) [2]
1. Кавычки для имени и пароля д.б одинарными, т.е.Add('USER '''+Trim(CreateBase.Edit2.Text)+'''');
2.Add('DEFAULT CHARACTER SET WIN1251');совершенно законно.
3. Не вижу задания имени БД.
Sergey13 (2005-10-27 16:42:00) [20]2Александр_н (27.10.05 14:58)
Это разовая задача или универвальный перегонщик из Оракла в ИБ?