S. D. F.
Шрифт:
– Да, в этом файле есть служебная база в которой будут хранится сведения о нашей базе.
* База о базе. Логично. Ведь логичное же, что директор завода Жигулей ездит на Мерседесе.
– Переписываем ShowTables:
–
procedure ShowTables(fn:string);
begin
FMain.Caption := fn;
with FMain.ListBox1 do
begin
Clear;
PrintList('select DISTINCT R.RDB$RELATION_NAME '+
'from RDB$RELATION_FIELDS R '+
'where R.RDB$SYSTEM_FLAG = 0 order by R.RDB$RELATION_NAME');
end;
end;
*
– Совершенно точно. А теперь функция PrintList:
010 function PrintList( iSQL:string):boolean;
020 begin
030 with DataModule2.IBSQL1 do
040 begin
050 result := false;
060 Close;
070 SQL.Clear;
080 SQL.Add(iSQL);
090 ExecQuery;
100 if RecordCount = 0 then
110 begin
120 FMain.ListBox1.Items.Add('Empty');
130 result := true;
140 exit;
150 end;
160 while not EOF do
170 begin
180 FMain.ListBox1.Items.Add( trim(Fields[0].AsString));
190 Next;
200 end; // while
210 end;
220 end;
– PrintList выполняет (стр. 90) наш первый SQL запрос (стр. 80). В случае, когда осмысленного ответа нет (стр. 100-150) выдается надпись - 'Empty' т.е. базы нет, а иначе (стр. 160-200) выдаем список таблиц в нашей базе.
* А что за страшную строку получает PrintList получает как параметр.
– Это тот самый запрос и есть. Пока разбирать его не будем.
– * -
(уточнение, “- * -“ равняется банке пива)
– Ну как, чего ты такой…
* Опять, не работает.
– Привыкай к тяготам лишениям нашей службы…
– Ну что там у нас
* Operation cancelled at user's request
– Н-да, и что характерно, каждый раз на этом месте…
– Так, у компонента IBDatabase1 измени свойство LoginPrompt на False. И будет тебе счастье.
– * -
* Ну, что, сразу нельзя было сказать?
– Забыл, бывает…
– Как, заработало?
* Да, но гора родила мышь. Ввели много дополнительных слов, а результат тот же.
– Ничего, скоро мышка превратится в кошку, затем в собачку а там и до крокодила недалеко.
* Не п*ди, что будем делать дальше?
– Дальше?
Готовимся выполнять SQL запросы.
– Для начала, что попроще.
– На закладке History помести TMemo – во всю ее ширину и высоту, да, назови это дело His.
– А на закладке SQL надо расположить тоже TMemo (у меня оно названо Memo1) и для начала пару кнопок “Run SQL” и “Clear SQL”.
– Теперь делаем процедуры кнопок:
procedure TFMain.Button1Click(Sender: TObject);
begin // кнопка run SQL
RunSQL( MakeSQL);
end;
* Опять временно?
– Ну, не хочу тебя сразу пугать, все по очереди.
– Обрати внимание на комментарий к слову begin – рекомендую так подписывать процедуру, если название ее мало информативно.
* А вторая кнопка?
– Ну, даже неудобно…
procedure TFMain.Button2Click(Sender: TObject);
begin
Memo1.Clear;
end;
* Да, проще некуда. Так теперь по очереди RunSQL( MakeSQL);
– Недавно переделал, довольно много повкалывал с этими 30 строками…
010 function RunSQL( S:string):boolean;
020 var
030 b : boolean; // отслеживание ошибки
040 Mistake : string; // сообщение ошибки
050 begin
060 with DataModule2.IBSQL1 do
070 begin
080 Close;
090 SQL.Clear;
100 SQL.Add(S);
110 try
120 ExecQuery; // попытка выполнения запроса
130 b := true; // ошибки нет
140 except // Обработка ошибки
150 on E: Exception do
160 begin
170 b := false; // к сожалению, ошибка
180 Mistake := E.ClassName+' raised exception: '+E.Message;
190 end;
200 end; // try
210 end; // with DataModule2
220 result := not b;
230 if b
240 then
250 begin // запрос выполнен
260 Hi.Lines.Add('ok');
270 Memo1.Clear; // и переход на закладку History
280 if DataModule2.IBSQL1.SQLType = SQLSelect
290 then PrintSELECT(S) // распечатка результата запроса SELECT
300 else PageControl1.ActivePageIndex := 3;
310 end
320 else
330 begin // была ошибка
340 ShowMessage(Mistake); // сообщение об ошибке
350 Hi.Lines.Add('Error');
360 Hi.Lines.Add(Mistake); // запись в историю
370 end;
380 Hi.Lines.Add('------------');
390 end;
– Самое интересное происходит, когда запрос НЕ выполняется.
* Прочитал, все понятно, и над чем тут было биться?
– Все понятно? Отлично, объясни тогда строки 280, 290.
* Так, интересно. Определяется тип запроса и если это SELECT. Нечестно, ты еще ничего не сказал о PrintSELECT.