Форум: "Базы";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
Внизviews in IB6 Найти похожие ветки
← →
koks (2002-08-30 14:32) [0]Уважаемые мастера !
Я новичок в IB6. Подскажите пожалуйста:
1. Как из прогрмы на D5 запустить сервер IB6. (Желательно предварительно проверить, установлен ли он и не запущен ли он уже)
2. Как определить наличие конкретного ViewName. т.е. мне надо создать новый view и предварительно удалить старый, если он уже есть. (с таким же именем ессно).
3. Если у меня view под гридом, смогу ли я используя TIBUpdateSSQL и ChachedUpdates организовать добавление/редактирование/удаление записей. view построен на основе SELECT-а из одной таблицы, но с очень комплексным уcловием выборки.
← →
Prooksius (2002-08-30 16:43) [1]Раз ты новичок в IB, советую почитать доки по нему .
1. Зачем тебе запускать IB Server из твоей программы. Он на то и сервер, чтобы быть независимым от программ. Он загружается при старте windows, сам работает. Очень редко его необходимо запускать вручную. М.б. тебе надо подключиться к серверу?
2. Надо покопаться в системных таблицах. Точно не знаю, где там эти названия View-ов. ( www.ibase.ru )
3. В принципе да.
← →
Desdechado (2002-08-30 17:06) [2]1. сервер может (а чаще и должен) быть на другой машине. Поэтому вопрос лучше этого не делать.
3. view под IB работает очень медленно. Лучше создай хранимую процедуру, которая будет делать такую же выборку. Почти с гарантией, что это будет быстрее. Ну, а на результат ее работы UpdateSQL можно наложить запросто
← →
Val (2002-08-30 17:26) [3]дополню коллег:
2.select rdb$relation_name
from rdb$relations
where (rdb$relation_name = "myneedview")
and (rdb$view_source is not null);
(вчера точно такой же вопрос был по таблицам)
не работал с IB6, там нет такой классной штуки
CREATE OR REPLACE..?
← →
koks (2002-09-02 10:01) [4]2 Proksuis
А почему ты думаешь, что я задаю вопросы предварительно не прочитав в оригинале доки по IB6 закаченные с ibase.ru. Да, здесь встречаются чайники и халявщики, но не до такой же степени. Но гораздо чаще здесь встречаются люди, которым эти чайники и халавщики МЕРЕЩАТСЯ.
2 Desdechado и Val - спасибо большое, ваши советы помогают (в отиличе...). Но у меня IB6 работает (и будет работать) как Local Server. Не спрашивайте почему - обстоятельства в данном случае сильнее здравого смысла. Вот именно поэтому мне и надо проверять, установлен ли сервер и запускать его.
Идея с хранимой процедурой интересная - надо обмозговать. Но тогда встерчный вопрос - каким компонентом (IBSQL или что) лучше пользоваться, чтобы динамически создавать SP. Ну и ессно- как определить, что SP уже создана...
Заранее спасибо.
← →
Desdechado (2002-09-02 11:54) [5]для создания ХП я пользуюсь TQuery
а определить наличие одноименной приблизительно - Val © (30.08.02 17:26)
← →
Val (2002-09-02 12:09) [6]примерно так:
select rdb$procedure_name
from rdb$procedures
where ...;
← →
koks (2002-09-02 15:05) [7]Спасибо.... а как с запуском сервера...
← →
Prooksius (2002-09-02 16:16) [8]2 Desdechado: Обоснуй, пожалуйста, что View в IB работает медленнее. Только что создал вью и эквивалентную процедуру: работают одинаково. К тому же, если еще надо отсортировать по каким-либо полям (заранее неизвестно), с вью это сделать IMHO легче.
2 koks: Объясни зачем это тебе.
← →
koks (2002-09-02 16:51) [9]2 Prooksius
Зачем что 1,2,3 или все вместе... я же уже про кое-что писал.
← →
Prooksius (2002-09-02 16:54) [10]2 koks: Зачем тебе запускать сервер?
← →
Desdechado (2002-09-02 17:24) [11]2 Prooksius © (02.09.02 16:16)
а ты попробуй несколько полей возвращаемого датасета достать подзапросами из вьюхи - и поймешь всю мощь переменных в ХП :)
а сортировку с ХП тоже можно сделать (как внутри, так и к результату)
← →
koks (2002-09-03 09:35) [12]2 Prooksuis. Я хочу сделать так, как работает IBConsole. Если ее запускаешь, а сервер не запущен, то, при попытке залогиниться на сервер она спрашивает "А не запустить ли его"... (как Local Server ecсно)
Мою программу будет юзать человек, который вздрагивает при слове "сервер". Если я ему скажу примерно следующее "Вам нужно запускать сервер вручную" - он будет ..... ну скажем так - не поймет.
А постоянно вешать сервер "по умолчанию" жалко - машина слабая, office и пр. и так тормозят.
← →
Prooksius (2002-09-03 10:32) [13]2 Desdechado: Вчера пробовал. Ну не получается быстрее.
Раскажи, как ?
Без сортировки - одинаково, с сортировкой (внешней), SP страшно тормозит т.к. сервер планирует запрос с вью правильнее, чем с SP.
С вью используются индексы, а с ХП - sort и все тут. :-(
Хотя, конечто, оптимизатор в IB не самый лучший...
В дополнение, если join-ить в запросах SP и table, могут быть глюки на сервере вплоть до его падения (может, уже пофиксили, незнаю).
Вообще-то я работаю на IB 5.6. Может, в этом дело... :-)
2 koks: В таком случае (как я понял, у тебя только локальная база), тебе не следует пользоваться IB.
Переходи на Paradox. Будет и быстрее, и меньше проблем..
Ну не нужно тебе стрелять пущкой по воробьям.
← →
Val (2002-09-03 11:15) [14]>Prooksius © (03.09.02 10:32)
зря вы советуете человеку переходить с IB на Paradox, не учитывая ничего кроме того, что база локальная - не профессионально, по-моему. IB отнюдь не пушка, а воробьи у него или нет - неизвестно.
>koks
насчет корректного запуска сервера, думаю лучше все-таки вам узнать на ibase.ru. Там все-таки именно его спецификой занимаются.
← →
Desdechado (2002-09-03 11:26) [15]2 Prooksius
1. не всегда, конечно, но в большинстве случаев ХП быстрее вьюх. Пример: одно из полей возвращаемого датасета зависит от другого через подзапрос. Но это второе поле имеет всего 2 значения на выборке из 100 записей. Так в ХП первое можно посчитать всего 2 раза, а потом подставлять в результат, а во вьюхе оно будет вычисляться для каждой строки. Хотя многое зависит от качества написания ХП и конкретных условий.
2. с внешней сортировкой естественно будет тормозить :) а с внутренней - нормально.
3. насчет глюков в join первый раз слышу, хотя я не часто такое использую, мне проше еще одну ХП написать
4. я работаю на FireBird 1
2 koks
1. На парадокс НЕ переходи. Это прошлый век. Пусть там и остается. Никаких вьюх, триггеров, ХП, автоматической проверки целостности и непротиворечивости там нет. Проблем явно будет больше (см. вечные вопросы в форуме по порче индексов и т.д.). Скорость - имхо, не быстрее.
2. Стартовать IB на локальной машине можно так. Поискать в реестре HKEY_LOCAL_MACHINE\SOFTWARE\Borland\InterBase\CurrentVersion\ServerDirectory и запустить оттуда IBGuard.exe
3. можно еще и при выходе гасить IB-сервер :)
2 Prooksius
IB совсем не пушка, а нормальное противотанковое ружье - разорвет пополам как БТР, так и коммандо :)
← →
Prooksius (2002-09-03 19:53) [16]2 All: Ну с парадоксом я... ну это... поспешил маленько... :))))))
Хотя, в свое время работал и с ним, все было нормально (при условии нормальных настроек BDE, сети и т.д.)
Ну, конечно, я не знаю много парадокс... Сорри.
← →
ne (2002-09-04 05:49) [17]на счет запуска сервера - я это делаю так
здесь используется еще один модуль - vxIBInit.pas - это не я написал - но использую
напишите мне на мыло - я вышлю и сейчас попытаюсь выложить в кладовку
....
uses
Forms,
SysUtils,
Dialogs,
IB,
IBErrorCodes,
...
vxIBInit in "vxIBInit.pas",
...
{$R *.RES}
var
x: boolean;
s: string;
begin
Application.Initialize;
try
S := ExtractFilePath(ParamStr(0)) + ".\DATA\09.gdb";
If FileExists(S) then
begin
x := vxInitIBClient;
if X then
begin
Application.CreateForm(TDatamodule2, Datamodule2);
If Assigned(DataModule2.IBDatabase) then
begin
s := ExtractFilePath(ParamStr(0)) + "DATA\ХХХХ.gdb";
If DataModule2.IBDatabase.Connected then DataModule2.IBDatabase.Connected := false;
DataModule2.IBDatabase.DatabaseName := s;
Application.CreateForm....;
vxIBConnect(DataModule2.IBDatabase);
end;
end;
end
else ShowMessage("Не обнаружена база данных в каталоге \DATA. Работать невозможно!")
finally
end;
Application.Run;
end.
← →
koks (2002-09-04 10:29) [18]Всем огромное спасибо!
1. На PARADOX не перейду ни за что.
2. Попробую использовать вьюхи. Уж очень они хорошо "ложаться" на мою задачу. Если не пройдет буду ломать ХП.
← →
koks (2002-09-04 15:17) [19]2 Val:
Объясни пожалуйста, зачем в твоем примере присутствут проверка:
and (rdb$view_source is not null);
разве первого условия не хватит..
← →
Val (2002-09-04 15:42) [20]это проверка, не является ли таблицей - просто не помню, могут ли быть одинаковые названия у вью и таблицы, поэтому и поставил.
← →
koks (2002-09-04 16:03) [21]2Val
нет, они обинаковыми быть не могут...
Не пойму, почему не работает:
function TdmWork.ViewExists(ViewName: string): boolean;
begin
Result := false;
with IBTViews do
begin
if not Active then Open;
First;
while not Eof do
begin
if (CompareText(FieldByName("RDB$RELATION_NAME").AsString, ViewName) = 0)
then Result := true;
Next;
end;
end;
end;
Свойства:
IBTViews.TableName = "RDB$RELATIONS"
Условие If НИКОГДА не появляется... Хотя ViewName точно есть.
← →
Val (2002-09-04 16:22) [22]возможно несовпадение в регистре букв? посмотрите в Watch List, например. Да и на пробелы следует обратить внимание, возможно.
← →
koks (2002-09-04 16:31) [23]Функция вызывается: if ViewExists("VPolished"); - никаких пробелов. CompareText проверяет строки на совпадение без учета регистра - я поэтому ее и использую...
← →
Val (2002-09-04 16:42) [24]FieldByName("RDB$RELATION_NAME").AsString - ну а чему это равно?
честно говоря, мне не нравится ваш метод определения существования вью.
Я бы создал квери в этой процедурке(или использовал какой-нибудь общего назначения), запрос с параметром(вх.параметр процедуры), затем проверил бы на наличие записей в возвращаемом им НД и выдавал бы как результат процедуры.
А вы бегаете последовательно по системной таблице, да еще и компонент специально для этого выделили. И неплохо бы у вас прерывать цикл поиска, когда нашли вью, зачем до конца бежать?
← →
Val (2002-09-04 16:49) [25]и еще, вероятно в вашей процедурке нужно использовать AnsiCompareText
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.09.26;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.007 c