Форум: "Базы";
Текущий архив: 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.021 c