有關取得所有Table Name的問題... |
尚未結案
|
minjiu
中階會員 發表:27 回覆:119 積分:69 註冊:2002-06-26 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
|
minjiu
中階會員 發表:27 回覆:119 積分:69 註冊:2002-06-26 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
你可以試著 trace 一下 GetTableNames 來查出 view 的判定, 我改寫了一下 TSession 的 GetTableNames 的 procedure, 來取出非 view 的 tables, 如下,
uses DB, DBTables, bde; ... procedure GetTableNames2(Database: TDatabase; const Pattern: string; Extensions, SystemTables, ViewTables: Boolean; List: TStrings); var Cursor: HDBICur; WildCard: PChar; Name: string; SPattern: DBITBLNAME; Desc: TBLBaseDesc; Database: TDatabase; begin List.BeginUpdate; try List.Clear; Database.Open; try WildCard := nil; if Pattern <> '' then WildCard := AnsiToNative(Database.Locale, Pattern, SPattern, SizeOf(SPattern) - 1); Check(DbiOpenTableList(Database.Handle, False, SystemTables, WildCard, Cursor)); try while DbiGetNextRecord(Cursor, dbiNOLOCK, @Desc, nil) = 0 do with Desc do begin if Extensions and (szExt[0] <> #0) then StrCat(StrCat(szName, '.'), szExt); NativeToAnsi(Database.Locale, szName, Name); if (not Desc.bView) or (Desc.bView and ViewTables) then List.Add(Name); end; finally DbiCloseCursor(Cursor); end; finally Database.Close; end; finally List.EndUpdate; end; end; procedure TForm1.Button1Click(Sender: TObject); begin // TDatabase, Pattern, Extensions, SystemTables, ViewTables, Strings GetTableNames2(Database1, '', False, False, False, Memo1.Lines); end;傳入參數第一個為你的 database, 後面的 Pattern, Extensions, SystemTables 可以參考 help 中的說明, ViewTables 是指是否要傳回 view, 最後則是接收 table 名稱用的一個 strings! |
minjiu
中階會員 發表:27 回覆:119 積分:69 註冊:2002-06-26 發送簡訊給我 |
|
Wesly
中階會員 發表:14 回覆:103 積分:53 註冊:2002-05-31 發送簡訊給我 |
不知道Postgre SQL是否支援ADO
若有支援ADO,則有一個方法
1.自定表格,不含View。
ADOConnection1.OpenSchema(siTables, VarArrayOf([Catalog, Unassigned, Unassigned, 'TABLE']), EmptyParam, ADODataSet1);
2.預視表格
ADOConnection1.OpenSchema(siTables, VarArrayOf([Catalog, Unassigned, Unassigned, 'VIEW']), EmptyParam, ADODataSet1);
3.系統表格
ADOConnection1.OpenSchema(siTables, VarArrayOf([Catalog, Unassigned, Unassigned, 'SYSTEM TABLE']), EmptyParam, ADODataSet1);
4.全部表格
ADOConnection1.OpenSchema(siTables, VarArrayOf([Catalog, Unassigned, Unassigned, Unassigned]), EmptyParam, ADODataSet1); 希望能對你有所幫助.
|
minjiu
中階會員 發表:27 回覆:119 積分:69 註冊:2002-06-26 發送簡訊給我 |
引言: 不知道Postgre SQL是否支援ADO 若有支援ADO,則有一個方法 1.自定表格,不含View。 ADOConnection1.OpenSchema(siTables, VarArrayOf([Catalog, Unassigned, Unassigned, 'TABLE']), EmptyParam, ADODataSet1); 2.預視表格 ADOConnection1.OpenSchema(siTables, VarArrayOf([Catalog, Unassigned, Unassigned, 'VIEW']), EmptyParam, ADODataSet1); 3.系統表格 ADOConnection1.OpenSchema(siTables, VarArrayOf([Catalog, Unassigned, Unassigned, 'SYSTEM TABLE']), EmptyParam, ADODataSet1); 4.全部表格 ADOConnection1.OpenSchema(siTables, VarArrayOf([Catalog, Unassigned, Unassigned, Unassigned]), EmptyParam, ADODataSet1); 希望能對你有所幫助.Hi...Wesly!! 1. 請問上面那個"Catalog"是要Uses哪個單元,我編譯會出現"Undeclared identifier: 'Catalog'"的錯誤訊息? 2. 我要利用哪個方法才能將取得的Table Name存到ListBox中? 謝謝!! |
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
幫 Wesly 兄補充一下, 關於 OpenSchema 的第二個參數是一個限制條件, 主要是要讓出現的結果限制在你要的條件下, 第一個參數的 Catalog 就是資料庫名稱, 也是傳入字串型, 至於如何取回, 就如同操作一般的 dataset 一樣就行了, 寫個小 sample 給你參考!
procedure TForm1.Button1Click(Sender: TObject); begin Memo1.Lines.Clear; ADOConnection1.OpenSchema(siTables, VarArrayOf(['test', Unassigned, Unassigned, 'TABLE']), EmptyParam, ADODataSet1); while not ADODataSet1.Eof do begin Memo1.Lines.Add(ADODataSet1.FieldByName('TABLE_NAME').AsString); ADODataSet1.Next; end; end; |
minjiu
中階會員 發表:27 回覆:119 積分:69 註冊:2002-06-26 發送簡訊給我 |
|
seaturn99
版主 發表:69 回覆:427 積分:214 註冊:2003-08-25 發送簡訊給我 |
引言: 非常感謝timhuang及Wesly前輩的熱心回答... 不過在Postgre SQL下,還是一樣會把View顯示出來,真是怪啊~~ Postgres SQL....真是搞不懂你啊 =.=minjiu 您好 : 提供一個不優雅的方法(只能治標解決一些問題),將 View Table 與一般 table 命名的作區別,Ex : 將 View Table 以 vt_ 開頭 ... 在顯示的時候再濾掉... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ---- |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |