Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 25.03.2009, 22:53   #1
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию Как программно обновить в BDE таблицы....

Задача. Есть база данных. Все таблицы paradox, их отображения хранятся в модуле данных DMBase и подключеные через Алиас MyBase по путик DataBaseName = MyPath.

Нюанс в том, что база сетевая и путь к ней задается извне и база может быть где угодно, и каждый раз, заходя в программу выбирается свой путь к базе.

База растет и меняется и возникается необходимость программно добавить в таблицу Table1 поле Pole.

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

Вот как я это пытаюсь делать

try
// проверяем есть ли заданное поле
T_update.Close; // пустая таблица для соединения с реальным файлом
T_update.TableName := DBName+TableName+'.db';
T_update.Open;
ts := T_update.FieldByName(PoleName).AsSt ring;
T_update.Close;
UpdateTable := 2; //поле есть - все хоккей
except
try
{возникол исключения, значит искомого поля нет. создаем поле}
Query1.Close;
Query1.SQL.Clear;
ts := 'ALTER TABLE '+TableName+' ADD '+PoleName+' '+TypePole;
Query1.SQL.Add(ts);

Query1.ExecSQL;
// !!!!!!!!!!!!!!!!11 вот здесь при выполнении запроса -ошибка. так как
// квери настроем черти куда.
// при попытке сделать
// Query1.Database.Params.Values['PATH'] := DBName
// возникает исключение, так как пытаемся подключиться к базе, где
// еще нет создаваемого поля. Замкнутый круг, как из него выйти?

UpdateTable := 1; // поле создано
except
UpdateTable := 0; // какая-то ошибки создания поля
end;


Помогите. кто знает.
Может это решается иначе? Задача - перед запуском программы по заданным шаблонам проверить таблицы, и если не хватает полей - надо их добавить. Сложности - сеть и путь к базе.

Спасибо.
и это пройдет...
grenles вне форума
Старый 25.03.2009, 23:43   #2
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию Дополнение

Разбираясь с проблемой, обнаружилось, что всего-то надо придумать, как сменить путь к базе для запроса КВЕРИ, чтобы он сделал все верно.

Вариант апдейта базы работает, когда "дефаултный" путь и путь к базе совпадают, тогда таблицы для обновления и квери работают с одним и тем же путем.
А как изменить путь?
и это пройдет...
grenles вне форума
Старый 26.03.2009, 00:07   #3
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну проставьте в компоненте Query1 св-во DatabaseName
только это нужно сделать до выполнения квери

Код:
if Query1.Active then
   Query1.Close;
//может лучше все-таки заюзать компонет TDatabase?
Database1.Database.Params.Values['PATH'] := DBName;
Query1.SQL.Clear;

Последний раз редактировалось soleil@mmc; 26.03.2009 в 00:12.
soleil@mmc вне форума
Старый 26.03.2009, 00:13   #4
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию нашел решение, я просто неверно путь пихал в квери

function UpdateTable(Path, TableName, PoleName, TypePole : String) : integer;
var
st : string;
begin

try
// проверяем есть ли заданное поле
T_update.Close;
T_update.TableName := DBName+TableName+'.db';
T_update.Open;
ts := T_update.FieldByName(PoleName).AsSt ring;
T_update.Close;
UpdateTable := 2;
except
try
T_update.Close;
{создаем поле}
RxQueryCreate.Close;
RxQueryCreate.SQL.Clear;

RxQueryCreate.DatabaseName := DBName; // вот оно, что надо было!!!!!!!!!!

ts := 'ALTER TABLE '+TableName+' ADD '+PoleName+' '+TypePole;
RxQueryCreate.SQL.Add(ts);
RxQueryCreate.ExecSQL;

UpdateTable := 1;

except

On E : EDatabaseError do begin
MessageDlg('Ошибка открытия Базы'+#13+
E.Message,mtConfirmation,[mbOk],0);
UpdateTable := 0;
end;

end;
end;
end;
и это пройдет...
grenles вне форума
Старый 26.03.2009, 00:18   #5
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Правда вариант примитивный без учета индексов, создание копии таблицы не случай облома выполнения запроса и прочее. Но уже есть от чего плясать.
и это пройдет...
grenles вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обновить Nod32 jenja Софт 1 04.03.2009 01:27
Как обновить?? Vremya-Dengy Общие вопросы Delphi 6 17.02.2009 22:44
как обновить листбокс? counter Win Api 2 16.02.2009 11:42
БД в Delphi - как отказаться от BDE? JoanM БД в Delphi 21 09.01.2008 03:40
Программно связать таблицы Таня84 БД в Delphi 0 20.03.2007 18:43