Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++ Builder] Модификация уже существующей БД


Автор: NordWolf 21.8.2007, 13:35
Дело такое. Вот моя локальная БД. 

http://slil.ru/24762177

Таблицы в формате PARADOX. Среда программирования: C++ Builder 6. Установлен Interbase 6.5, но я  его никак не использовал и пользоваться им не пробовал (не умею).

Нужно модифицировать её так, чтобы таблицы находились на каком-либо сервере и при работе с данным я вызывал по определённому запросу (Весь список, либо по определённому критерию) нужную информацию, мог изменять её, добавлять новый элемент списка и сохранять.
Если у вас получится это сделать (а я уверен, что для вас это тривиальная задача), то просьба объяснить как вы это сделали? Вообще это моя курсовая.

Буду благодарен за любую помощь

Автор: NordWolf 22.8.2007, 12:40
На сколько я знаю Paradox - локальная БД. И реализовать запросы для выборки определённой информации с таблицы можно только через InterBase. Я так понимаю?

Автор: Rodman 23.8.2007, 16:24
Interbase и Paradox разные вещи... судя по твоим словам - ты открываешь Paradox'овские таблицы при помощи Interbase. 
Цитата(NordWolf @  23.8.2007,  16:04 Найти цитируемый пост)
Задача решаема вообще? 

просто не совсем понятна суть вопроса, вот и тишина... сформулируй по подробнее... если сам не совсем рубишь в этих делах, то друга (или спеца) какого нить попроси чтобы он написал на понятном языке (конечно предварительно обьяснив ситуацию ему)!

Автор: NordWolf 23.8.2007, 22:45
Вообщем так. Использую я таблицы парадоксовские. А вот как сделать чтобы инфа этих таблиц хранилась на каком-либо сервере. При нажатии на команды ВЕСЬ СПИСОК, ИСПРАВИТЬ и др можно было бы загружать эту информацию к себе на комп, исправлять и отсылать в на сервер эти исправления. Наверное так будет понятней. Прошу прощения за неумелость объяснить всё по-человечески.

собственно я уже пробовал сделать это здесь: http://forum.vingrad.ru/forum/act-ST/f-94/t-168665/unread-1.html 
Но там дают советы, которые я честно говоря не знаю как реализовать.

Автор: Rodman 27.8.2007, 12:05
NordWolf, качай IBExpert - при помощи него создавай новую базу, потом при помощи DataPump (я не знаю что это, но думаю для экспорта базы из одной СУБД в другую) и перекидывай таблицы и данные.

а дальше уже можно запускать билдер!

Ясно?

Автор: Damarus 27.8.2007, 12:27
Цитата(Rodman @  27.8.2007,  13:05 Найти цитируемый пост)
NordWolf, качай IBExpert - при помощи него создавай новую базу,

Можно и без IBExpert'а. Так примерно (NordWolf.sql):
Код

SET SQL DIALECT 3;
SET NAMES WIN1251;

CREATE DATABASE 'NordWolf.fdb' USER 'SYSDBA' PASSWORD 'masterkey'
    PAGE_SIZE 8192 DEFAULT CHARACTER SET WIN1251;

CREATE TABLE GLAVN (
    GNum FLOAT NOT NULL PRIMARY KEY,
    GFam VARCHAR(50),
    GName VARCHAR(50),
    GOtch VARCHAR(50),
    DRojd DATE,
    Obrazov VARCHAR(50),
    Adres VARCHAR(50),
    Telefon VARCHAR(10),
    DVstup DATE
);

CREATE TABLE ANKETA (
    ANum FLOAT NOT NULL PRIMARY KEY,
    Nacion VARCHAR(50),
    Vera VARCHAR(50),
    Inyaz VARCHAR(50),
    Dop1 VARCHAR(50),
    Dop2 VARCHAR(255),
    Dop3 VARCHAR(50)
);

COMMIT;


Цитата

isql -i NordWolf.sql


Добавлено через 14 минут и 51 секунду
NordWolf, но IBExpert тебе пригодится smile 

Автор: Damarus 27.8.2007, 18:18
Цитата(NordWolf @  27.8.2007,  18:33 Найти цитируемый пост)
так... мужики, что дальше с ним делать? Я запихнул весь код в файл NordWolf.sql 

В Interbase/FireBird есть такая утилитка - isql. Ну вот и выполняй команду:
Код
isql -i NordWolf.sql

После этого у тебя в текущей директории появится база NordWolf.fdb с двумя таблицами: GLAVN и ANKETA. Далее с помощью DataPump заполняешь её данными из базы PARADOX.

Добавлено через 55 секунд
PS. USER и PASSWORD надо поменять на реальные.

Автор: NordWolf 28.8.2007, 14:59
IB Expert 1.2 Выполнил - ИНСТРУМЕНТЫ > РЕДАКТОР SQL. Выбрал файл nordwolf.sql. Запусти скрипт. Получил файл NORDWOLF.FDB. Запускаем DataPump. Выбираем нашу парадоксовскую базу (из которой нужно данные перекинуть), жмём далее. Базы с названием NORDWOLF.FDB нету. Что сделать, чтобы она появилась? Как выбрать чтобы именно в неё вставлялись данные из парадоксовский базы? У меня есть предположение что тут как раз надо настроить ту базу которая отображается как IB Local чтобы она работала с NORDWOLF.FDB (через SQL Explorer, BDE Administrator)?

Автор: Rodman 28.8.2007, 15:54
Цитата(NordWolf @  28.8.2007,  15:44 Найти цитируемый пост)
в каком фильтре? В окне DataPump. 

ты хелп по нему не читал?
у тебя создана база FireBird - как я понимаю... 

вот при выборе базы твоей она не проходит фильтр, т.е. отображаются не FBD...

Автор: NordWolf 28.8.2007, 16:31
Я установил IB Expert 1.2 и Firebird-1.5.2.4731-Win32 на всякий случай. запустил IB Expert 1.2 и вставил там в интрументах > SQL редакторе присланный мне код. В итоге получился файл NORDWOLF.FDB.
Кстати, если удалить Firebird и проделать всё тоже самое в IB Expert, то пишет ошибку.

При этом никаких настроек в IBExpert я не производил и новых баз у меня не зарегистрировано.

Автор: Rodman 28.8.2007, 16:41
Цитата(NordWolf @  28.8.2007,  16:31 Найти цитируемый пост)
Кстати, если удалить Firebird и проделать всё тоже самое в IB Expert, то пишет ошибку. 

ну а как же... это сервер, а без него как без рук...

добейся чтобы у тя появился файл NORDWOLF.gdb... потом конвертация должна пойти как по маслу!!!

Автор: NordWolf 28.8.2007, 16:50
Добился. в скрипте просто исправил CREATE DATABASE 'NordWolf.fdb'  на CREATE DATABASE 'NordWolf.gdb'. Файл получился NordWolf.gdb причём абсолютно такого же размера.

Повтрю, что никаких настроек в IBExpert я не производил и новых баз у меня не зарегистрировано.

Автор: NordWolf 28.8.2007, 17:08
да тоже самое. 
=(
я так понимаю, чтобы новая база была видна, её нужно зарегистрировать в самом IB Expert.
Регитрирую.
Server — Local
Введите путь к файлу БД, например:путь до файла NORDWOLF.gdb
Alias: NordWolf_DB
Login: SYSDBA 
Password: masterkey 
Нажму кнопку Register

Выполняю подключение базы, запускаю DataPump. Выбираю из парадоксов, жму next и ничего. Те же базы. Новой нету.

Автор: Damarus 28.8.2007, 19:06
Цитата

Выполняю подключение базы, запускаю DataPump. Выбираю из парадоксов, жму next и ничего. Те же базы. Новой нету.

Так. Будем действовать по порядку.

1. Создаём базу Interbase/FireBird (я использовал FireBird):
Код

E:\Development\NordWolf>isql -i NordWolf.sql
Use CONNECT or CREATE DATABASE to specify a database

E:\Development\NordWolf>

Можно и через IBExpert.

2. Алиас для базы PARADOX в BDE Administrator'е. У тебя наверное уже есть.

3. DataPump. Я использовал эту: http://www.clevercomponents.com/downloads/datapump/dpdownload.asp. Ставим. Запускаем. Указываем базы:
http://img205.imageshack.us/my.php?image=44734635xc7.png

Далее. Закладка Step2: Order. Жмём Get Definitions. Затем Build Relations. Должно получится так:
http://img209.imageshack.us/my.php?image=25728175zi1.png

Далее. Закладка Step3: Pump. Жми Start.

Всё. Теперь в базе NordWolf.fdb данные из базы PARADOX.

Автор: NordWolf 29.8.2007, 12:15
так, попрорбую получить данный файл самостоятельно. 

Обдумывал тут прошлой ночью все действия и понял что можно ещё попробовать инным путём. Ведь у нас есть стандартная база в С++ под именем IBLocal, в настройках через ДБЕ Админ есть путь к стандартному файлу в поле Server name: c:\Program Files\Common Files\Borland Shared\Data\employee.gdb. NordWolf.gdb у нас получен. Так может просто поменять этот стандартный employee.gdb на путь к файлу NordWolf.gdb и потом туда перенести данные из парадокс-базы. Как такой варинат, прокатит?

Автор: NordWolf 29.8.2007, 16:14
при установке DataPump вылазиет ошибка номер 401 (момент установки -  updating interbase SQL links Configuration) "string variable is not large enought for string. check the string decarations." Жму ОК.

Создаю точный путь. E:\Development\NordWolf>. туда кидаю NordWolf.sql. Копирую из FireBird утилиту isql. Набираю в компандной строке E:\Development\NordWolf>isql -i NordWolf.sql. Вылазиет окошко досовское и скрывается. Никакой NORDWOLF.FDB не создаётся. Скачиваю архив и кидаю в ту папку.

Делаю всё по интрукции. Нажимаю в последней закладке - START. 12 ошибок.

Код



=== Generated by: Interbase DataPump v 3.4
=== Start Pumping: 29.08.2007 17:14:58
=== Source Database: DPNI
STANDARD
PATH=E:\BaseDPNI
ENABLE BCD=FALSE
DEFAULT DRIVER=PARADOX
Select Option - select * from table
=== Destination Database: E:\Development\NordWolf\NORDWOLF.FDB
SQLDialect: 3
user_name=SYSDBA
password=masterkey
lc_ctype=WIN1251
HOME-8FYG0XH9ZF
WI-V6.5.0.28
=== Switch Off all Ref. Constraints with loop
=== Alter triggers
 >  Data Committed.
=== Table: ANKETA
-- Source
Flat Table: ANKETA.DB
-- Dest
SQL: INSERT INTO "ANKETA"
("ANUM","NACION","VERA","INYAZ","DOP1","DOP2","DOP3")
VALUES (:PAR0,:PAR1,:PAR2,:PAR3,:PAR4,:PAR5,:PAR6)

 !  Error 1:violation of PRIMARY or UNIQUE KEY constraint "INTEG_4" on table "ANKETA"
 !  Error 2:violation of PRIMARY or UNIQUE KEY constraint "INTEG_4" on table "ANKETA"
 !  Error 3:violation of PRIMARY or UNIQUE KEY constraint "INTEG_4" on table "ANKETA"
 !  Error 4:violation of PRIMARY or UNIQUE KEY constraint "INTEG_4" on table "ANKETA"
 !  Error 5:violation of PRIMARY or UNIQUE KEY constraint "INTEG_4" on table "ANKETA"
 !  Error 6:violation of PRIMARY or UNIQUE KEY constraint "INTEG_4" on table "ANKETA"
 >  Data Committed.
--- Source Records Processed: 0
=== Table: GLAVN
-- Source
Flat Table: GLAVN.DB
-- Dest
SQL: INSERT INTO "GLAVN"
("GNUM","GFAM","GNAME","GOTCH","DROJD","OBRAZOV","ADRES","TELEFON","DVSTUP")
VALUES (:PAR0,:PAR1,:PAR2,:PAR3,:PAR4,:PAR5,:PAR6,:PAR7,:PAR8)

 !  Error 7:violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "GLAVN"
 !  Error 8:violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "GLAVN"
 !  Error 9:violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "GLAVN"
 !  Error 10:violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "GLAVN"
 !  Error 11:violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "GLAVN"
 !  Error 12:violation of PRIMARY or UNIQUE KEY constraint "INTEG_2" on table "GLAVN"
 >  Data Committed.
--- Source Records Processed: 0
=== Switch On all Ref. Constraints with loop
=== Alter triggers
 >  Data Committed.
=== Update Generators
 >  Data Committed.

=== Statistical Info ===

  ANKETA:
    !  Errors - 6
    Source Records Processed - 0
    Destination Records Affected - 0

  GLAVN:
    !  Errors - 6
    Source Records Processed - 0
    Destination Records Affected - 0


=== Errors: 12
 !  Warnings: Your "Select Option" and "Quote Filed Names" are probably incorrect.
Please go to "Step 1: Databases" set the proper values and try again.
=== Total Source Records Processed: 0
=== Finish Pumping:29.08.2007 17:14:59
   

Автор: Damarus 29.8.2007, 17:51
Цитата(NordWolf @  29.8.2007,  17:14 Найти цитируемый пост)
при установке DataPump вылазиет ошибка номер 401 (момент установки -  updating interbase SQL links Configuration) "string variable is not large enought for string. check the string decarations." Жму ОК.

Не обращай внимания. У меня тоже такое было.

Цитата(NordWolf @  29.8.2007,  17:14 Найти цитируемый пост)
Копирую из FireBird утилиту isql.

Не надо копировать. Пропиши путь к isql (по умолчанию C:\Program Files\Firebird\Firebird_1_5\bin) в PATH. Потом открывай командную строку. Переходи в директорию с NordWolf.sql:
Код
cd /d "E:\Development\NordWolf"

Затем пиши:
Код
isql -i NordWolf.sql


Цитата(NordWolf @  29.8.2007,  17:14 Найти цитируемый пост)
Делаю всё по интрукции. Нажимаю в последней закладке - START. 12 ошибок.

Просто в этой базе уже есть данные из базы PARADOX. И, соответственно, у тебя получаются одинаковые PRIMARY KEY.

Автор: NordWolf 29.8.2007, 23:57
Цитата(Rodman @  29.8.2007,  16:23 Найти цитируемый пост)
может в рукопашную скопировать... быстрее будет?!


Ну давай попробуем. Напиши порядок действий...

2Damarus - извини, поздно увидел. Завтра попробую, отпишусь.

С ТАКИМИ ПРОГРАММЕРАМИ КАК ВЫ Я НАДЕЮСЬ МЫ ДОБЬЁМ ЭТОТ КУРСАЧ! ;)

Автор: NordWolf 30.8.2007, 11:22
Цитата(Damarus @  29.8.2007,  17:51 Найти цитируемый пост)
Затем пиши:Без подсветки1:isql -i NordWolf.sql


вообщем получается такая штука:
user posted image

Автор: NordWolf 30.8.2007, 17:27
уф.. установил я вообщем IB Expert 1.2, Firebird 1.5 и попробовал сделать то что ты сказал...

2Rodman - напиши на всякой случай как вручную всё сделать.

Ладно, у нас есть файл готовый (NordWolf.fdb), переноса данных добились. Теперь я  так понимаю нужно работать непосредственно с компонентами С++.  Расскажите что и как?


Автор: NordWolf 4.9.2007, 16:02
Запустил DataPump, всё перенёс без проблем(All fine). Запускаю проект в с++

1)Добавляю компоненты IBDataSetl: TIBDataSet;  DataSourcel: TdataSource, IBTransaction: Transaction

2) Указываю свойства у IBTransaction:
DefaultDatabase->IBDataBase 
Transaction Editor - Read Commited

3)Свойства у IBDataSetl
Database->IBDatabase1
Transaction->IBTransaction1

4) У DataSourcel задаю свойство DataSet равным IBDataSetl, 

5)DBGridl задаю свойство DataSource равным DataSourcel. 

6) в свойстве SelectSQL у IBDataSetl прописываю: select *  from GLAVN. ОК. Указываю на свойстве этого же компонента ACTIVE - TRUE.

7) Запускаю. Жму ФАЙЛЫ - ВЕСЬ СПИСОК и ошибка. 

"Project Projectl.exe raised exception class EDatabaseError with message 'Table2: Cannot perform this operation on a closed dataset'. Process stopped. Use Step or Run to continue."

Что нужно исправить?

Автор: Rodman 4.9.2007, 16:17
Цитата(NordWolf @  4.9.2007,  16:02 Найти цитируемый пост)
Table2:

где взялась Table2???

Автор: NordWolf 4.9.2007, 22:16
Он как-то связан с ANKETA.DB

Автор: Rodman 5.9.2007, 08:29
покажи код и где вылетает!

Автор: NordWolf 6.9.2007, 16:59
указывает на этот код:

Код


void __fastcall TForm1::N15Click(TObject *Sender)
{
 if(form){
 AnsiString lang;
bool stat=true;
Table2->Refresh();

Form4->ComboBox1->Items->Clear();
Form6->ComboBox2->Items->Clear();
lang=Form1->Table2->FieldByName("Inyaz")->AsString;
Form4->ComboBox1->Items->Add(lang);
Form6->ComboBox2->Items->Add(lang);
for(int i=2;i<=Form1->Table2->RecordCount+1;i++){
stat=true;
lang=Form1->Table2->FieldByName("Inyaz")->AsString;

for(int j=0;j<=Form4->ComboBox1->Items->Count;j++)
{
if((lang=="")||(Form4->ComboBox1->Items->Strings[j]==lang))
stat=false;
}
if(stat){
Form4->ComboBox1->Items->Add(lang);
Form6->ComboBox2->Items->Add(lang);
}


Form1->Table2->Next();
}
                }



в частности на строку после Table2->Refresh(); 
(Form4->ComboBox1->Items->Clear();)

Автор: Rodman 7.9.2007, 09:18
а Table2 у тебя открыт. так как рефрешь мона делать на открытой таблице!

Автор: NordWolf 8.9.2007, 12:48
а как её скрыть?

Автор: Rodman 10.9.2007, 08:27
Цитата(NordWolf @  8.9.2007,  12:48 Найти цитируемый пост)
а как её скрыть? 

ну у темя в этом компоненте есть поле TableName...

Автор: NordWolf 11.9.2007, 00:51
усё, я всё сделал! )))

Огромное спасибо за помощь, курсовая зачтена.

Rodman,Damarus - отдельное спасибо

Rodman - Смотрю ты украинец.У меня недавно знакомая из Одессы приехала, говорит видел на центральной трассе плакат с надписью:
МЫ НЕ ЯНКИ, МЫ СЛАВЯНЕ
НАШИ БРАТЬЯ - РОССИЯНЕ! )))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)