Створення бази даннх програмним шляхом

Створення бази даннх програмним шляхом

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

Спасибі 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. Ось я і питаю - як це обійти. Дякуємо.

2Александр_н # XA0; (27.10.05 14:58)
Це разова завдання або універвальний перегонник з Оракл в ІБ?

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

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

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

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

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

Взагалі-то все це можна було б спробувати перегнати DataPump / IBDataPump. І не винаходити велосипед.

2 [8] Віталій Панасенко # XA0; (28.10.05 10:19)
У нього поки проблемма з метаданими, як я зрозумів.

Питання залишилося. Яке може бути кешування якщо комп'ютер був повністю перезавантажений, але ситуація повторюється IBConsole створену таблицю бачить (структуру та дані), але не бачить Inteactive SQL, тобто у відповідь на запит select count (*) table_name отримую відповідь Table unknown table_name.

Чітку послідовність дій приводь.

цілком може не вистачати прав на таблицю

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

Приведи DDL створення таблиці, і запит яким ти намагаєшся до неї звернутися.
Сильно підозрюю, що ти створив таблицю з case-sensetive ім'ям.

P.S. Викинь IBConsole, використовуй IBExpert.

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

> Сильно підозрюю, що ти створив таблицю з case-sensetive ім'ям.
Так, в 3 діалекті таке багатьох в безвихідь ставить.

Е-е-е.
А причому тут
Александр_н # XA0; (28.10.05 10:59) [10]
Питання залишилося. Яке може бути кешування якщо комп'ютер був повністю перезавантажений, але ситуація повторюється IBConsole створену таблицю бачить (структуру та дані), але не бачить Inteactive SQL, тобто у відповідь на запит select count (*) table_name отримую відповідь Table unknown table_name.
?

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

Навіщо тобі такі заморочки з TIBTable?
Використовуй TIBSQL і запит CREATE TABLE. набагато простіше, і код зрозуміліше буде.

1. Таблиця створилася і завантажилася даними. IBConsole її бачить (структуру та дані), але не бачить Inteactive SQL, тобто у відповідь на запит select count (*) table_name отримую відповідь Table unknown table_name. Причому якщо в базі створюю іншу таблицю з ISQL, то до неї той же запит проходить. # XA0; Виявив, що, якщо запит подати у вигляді # XA0; 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. Що я зробив не так?
Дякуємо.


> Що я зробив не так?
> Дякую.

Тобі вже відповіли:

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


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

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

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

Пам'ять: 0.78 MB
Час: 0.051 c

Схожі статті