Konu Başlığı : System Tables and Views
- Burada Veritabanının teknik yapısına dair bilgiler bulunmakta.
- Bana lazım olan kısımların SQL cümleciklerini Fonksiyon altına aldım. Ayrıca kod içerisinde anlamlı olsun diye önce tip tanımı yaptım. Bundan kasıt; koda tekrar döndüğümde hangi SQL cümleciğini istediğimi, ilerde tekrar ihtiyacım olduğunda okunur/anlaşılır kılmayı hedeflemek.
Kod: Tümünü seç
Type TMetaData = (mtTable, mtView, mtProcedure, mtTrigger, mtRole, mtGenerator, mtFunction, mtDomain, mtException);
- Aşağıda göreceğiniz gibi programı çoğu yerinde SQL cümleciklerinin bazılarını Select * ile tümünü alırken bazılarını özellikle tek tek field isimlerini verip nokta tespitinde bulundum...
- Bunun nedeni ise birden fazla versiyondaki Interbase/Firebird veritabanı yapısında farklı durumlar sözkonusu.
- Bazı field'lar birinde var diğerinde yok. (Örnek RDB$FIELD_PRECISION) Ben de bunu kullanıcıya sorsam da (hani register server derken hangi sürüm server olduğunu verdiğimiz EMS, IBExpert gibi) sormasam da garantilemek için tekrar kontrol edeceğime göre bunu sormadan her versiyona uyumlu olsun istedim.
- Olmayan Field'i select içine verdiğimde hata döneceğine, * jokeri ile hata farklılık gösteren tablo'ların alanlarının tümünü alarak hatayı bertaraf etmeyi hedefledim ve oldu.
- Ayrıca bu kontrol IBDatabase.SQLDialect integer cevabından kontrol edilebiliyor ve ona göre gardımızı alabilir ve o tablo alanını sorgudan çıkarabiliriz...
Kod: Tümünü seç
Function MetaDataListeSQL(Tip : TMetaData) : String;
begin
Case Tip of
mtTable: Result := 'SELECT RE.RDB$Relation_Name FROM RDB$Relations RE '+
' WHERE (RE.RDB$System_Flag = 0 or RE.RDB$System_Flag is NULL)'+
' AND (RE.RDB$View_Source is NULL)'+
' ORDER BY 1';
mtView: Result := 'SELECT RE.RDB$Relation_Name FROM RDB$Relations RE '+
' WHERE (RE.RDB$System_Flag = 0 or RE.RDB$System_Flag is NULL)'+
' AND (RE.RDB$View_Source is NOT NULL)'+
' ORDER BY 1';
mtProcedure: Result := 'SELECT PR.RDB$Procedure_Name FROM RDB$Procedures PR '+
' WHERE (PR.RDB$System_Flag = 0 or PR.RDB$System_Flag is NULL)' +
' ORDER BY 1';
mtTrigger: Result := 'SELECT *'+
' FROM RDB$TriggerS' +
' WHERE (RDB$System_Flag IS NULL OR RDB$System_Flag=0)' +
' AND RDB$Trigger_Name NOT IN (SELECT RDB$Trigger_Name' +
' FROM RDB$CHECK_CONSTRAINTS)' +
' ORDER BY RDB$Trigger_Name';
mtRole: Result := 'SELECT RO.RDB$Role_Name FROM RDB$Roles RO '+
' WHERE (RO.RDB$System_Flag = 0 or RO.RDB$System_Flag is NULL)';
mtGenerator: Result := 'SELECT GE.RDB$Generator_Name FROM RDB$Generators GE '+
' WHERE (GE.RDB$System_Flag = 0 or GE.RDB$System_Flag is NULL)';
mtFunction: Result := 'SELECT FU.RDB$Function_Name FROM RDB$Functions FU '+
' WHERE (FU.RDB$System_Flag = 0 or FU.RDB$System_Flag is NULL)';
mtDomain: Result := 'SELECT FI.RDB$Field_Name FROM RDB$Fields FI '+
' WHERE (FI.RDB$System_Flag = 0 or FI.RDB$System_Flag is NULL)'+
' and SUBSTRING(FI.RDB$Field_Name FROM 1 FOR 4) <> ''RDB$''';
mtException: Result := 'SELECT EX.RDB$Exception_Name FROM RDB$Exceptions EX'+
' WHERE (EX.RDB$System_Flag = 0 or EX.RDB$System_Flag is NULL)';
end; // Case
end;
Kod: Tümünü seç
Procedure MetaDataListeAl(Tip : TMetaData; Liste:TStrings);
begin
Liste.Clear;
Try
with IBSQL1 do
begin
Close;
SQL.Text := MetaDataListeSQL(Tip);
Prepare;
ExecQuery;
if not Eof then
begin
Liste.Clear;
Repeat
Liste.Add(AdjustLineBreaks(Fields[0].AsString));
Next;
Until EOF;
Close;
Application.ProcessMessages;
end;
end; // With
Except // Burası Role, Function vb. tablolar yoksa pass geçsin diye
End;
end;
Kod: Tümünü seç
Var
Liste : TStringList;
begin
Liste := TStringList.Create;
MetaDataListeAl(mtTable, Liste);
TreeViewGuncelle('Tablo', Liste); // TreeView'i güncelleyen başka bir fonksiyondur.
...
...
Liste.Free;
end;
- Yarışmaya katılacaklara şimdiden başarılar...