在開發數據庫軟件的過程中,由於實際需求不斷髮生變化,數據庫結構也將隨之改變,這會給文檔更新工作帶來很大困難。如果能夠用軟件自動獲得數據庫的結構信息並生成報告文件,將減輕軟件的文檔工作量。
1 TSession對象
爲了管理應用程序與數據庫系統的多重連接,Delphi提供了TSession對象。Delphi中的數據訪問對象(Data Access Object)均包含Session屬性,用來指向與之對應的TSession對象。如果應用程序需要同時建立對數據庫系統(尤其是BDE數據庫)的多個連接,就必須定義多個TSession對象,屬於不同連接的數據訪問對象的Session屬性不能相同,否則將無法同時使用。
在數據庫應用程序運行時,Delphi會自動生成一個缺省TSession對象,名字爲Session,數據訪問對象在缺省情況下均與之相連。
TSession對象除了自動管理數據庫連接外,還能夠取得數據庫信息。下面就分別介紹這方面的函數。
2 獲取數據庫別名信息
TSession對象在獲取數據庫別名方面有3個函數/過程:
以下是引用片段: procedure TSession.GetAliasNames(List: TStrings); procedure TSession.GetAliasParams(const AliasName: string; List: TStrings); function TSession.GetAliasDriverName(const AliasName: string): string; |
GetAliasNames用來獲得所有的BDE別名名稱,結果保存在變量List中;GetAliasParams用來獲得某個BDE別名的參數,結果保存在變量List中;GetAliasDriverName用來取得某個BDE別名使用的數據庫驅動程序的名字。
這3個函數不太複雜,就不多加介紹了。一般情況下,我們只需要使用GetAliasNames即可。
3 獲取數據表信息
在知道了數據庫別名後,如何取出該別名對應數據庫中包含的數據表呢?可以使用TSession對象中的 GetTableNames過程。該過程描述如下:
以下是引用片段: procedure TSession.GetTableNames(const DatabaseName, Pattern: string; |
各參數意義如下:
DatabaseName:數據庫別名;
Pattern:過濾器,用來過濾結果,可以使用通配符。比如“*.dbf”,“t*” 等。如果爲空字符串,則表示不需要過濾;
Extensions:爲布爾量,表示是否顯示數據表擴展名。該參數只對DBF和Paradox數據庫有效;
SystemTables:爲布爾量,表示是否顯示系統數據表;
List:爲返回結果,結果按字母順序排序。
4 獲取數據域和索引信息
在取得了數據表信息後,應使用TTable對象訪問該數據表的具體信息。對應函數如下:
以下是引用片段: procedure TDataSet.GetFieldNames(List: TStrings); procedure TTable.GetIndexNames(List: TStrings); |
GetFieldNames用來取得數據表中的各個域名,GetIndexNames用來取得數據表中的各個索引名。
另外,可以進一步使用TDataset和TTable中的兩個屬性TDataSet.FieldDefs.Items[] 和 TTable.IndexDefs.Items[]來訪問具體的數據域信息和索引信息。它們分別是由TFieldDef和TIndexDef組成的數組。
TFieldDef描述如下:
TIndexDef描述如下:
TFieldType定義如下:
以下是引用片段: TFieldType = (ftUnknown, ftString, ftSmallint, ftInteger, ftWord, ftBoolean, ftFloat,ftCurrency, ftBCD, ftDate, ftTime, ftDateTime, ftBytes, ftVarBytes, ftAutoInc,ftBlob, ftMemo, ftGraphic, ftFmtMemo, ftParadoxOle, ftDBaseOle, ftTypedBinary,ftCursor); |
TIndexOptions定義如下:
以下是引用片段: TIndexOptions = set of (ixPrimary, ixUnique, ixDescending, ixExpression, ixCaseInsensitive); |
它們的具體意義可以參見Delphi幫助。
5 應用實例
使用下面的程序片段即可獲得指定數據庫中指定表的域定義和索引定義。ListBox1、ListBox2 和 ListBox3 爲Form1中定義的三個列表框,用於顯示結果。
以下是引用片段: Var Alias,TableName:String;
Table1:TTable;
Begin
Alias:='fjs'; TableName:='d*'; //初始化
Session.GetTableNames(Alias, {別名}
TableName, {過濾器}
True, {是否顯示文件擴展名(對DBF) }
False, {是否顯示系統表}
ListBox1.Items);
If ListBox1.Items.Count=0 then
Begin
MessageDlg('數據庫'+Alias+'中沒有數據表'+TableName, mtError, [mbOK], 0 );
Exit;
End;
Table1:=TTable.Create(nil);
Table1.DatabaseName :=Alias;
Table1.TableName := ListBox1.Items.Strings[0];
{取得表中字段名及索引名}
Table1.Open;
if Table1.Active then
begin
Table1.GetFieldNames(ListBox2.Items);
Table1.GetIndexNames(ListBox3.Items);
end;
//… 此時結果在ListBox2和ListBox3中
//
Table1.Destroy;
end;
|
6 小結
通過上面討論和實例證明,利用Delphi語言開發數據庫軟件管理系統,關鍵技術都已得到解決。
參考文獻
[1] (李維 編著).《DELPHI 7高效數據庫程序設計》機械工業出版社2003.1
[2] 郭旭等 著.《Delphi6應用開發指南》清華大學出版社2004.6
[3] 大富翁http://www.delphibbs.com/
<iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3528650120430763&dt=1184288423625&lmt=1184288423&format=468x60_as&output=html&correlator=1184288423609&url=http%3A%2F%2Fpost.blog.hexun.com%2Finc%2Fadminarticleedit.aspx%3Fblogname%3Dxctv&ad_type=text_image&ui=rc%3A6&flash=9&u_h=768&u_w=1024&u_ah=708&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="468" scrolling="no" height="60" allowtransparency="allowtransparency"></iframe>