線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1898
推到 Plurk!
推到 Facebook!

有關取得所有Table Name的問題...

尚未結案
minjiu
中階會員


發表:27
回覆:119
積分:69
註冊:2002-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-12 12:56:18 IP:220.130.xxx.xxx 未訂閱
請問有人知道如何取得某個Database內所有TableName的名稱(不包含View)嗎? 目前是用TDatabase.GetTableNames來取得...但會連View都會取出來... SQL Server環境:MS SQL, Postgre SQL...(最好能支援所有SQL Server) 煩請知道的人回答一下吧~~謝謝!! 發表人 - minjiu 於 2004/08/12 17:19:50
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-12 13:18:07 IP:203.95.xxx.xxx 未訂閱
Hi, for MS SQL Server 可以這樣下取得 user table (不含 view) !! select [name] as tbl_name from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1
minjiu
中階會員


發表:27
回覆:119
積分:69
註冊:2002-06-26

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-12 14:28:02 IP:220.130.xxx.xxx 未訂閱
引言: Hi, for MS SQL Server 可以這樣下取得 user table (不含 view) !! select [name] as tbl_name from dbo.sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1
timhuang您好!! 這個用法只能適用於MS SQL,不知有沒有其他方法可以連其他SQL Server也都能適用的...
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-08-12 16:37:31 IP:203.95.xxx.xxx 未訂閱
你可以試著 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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-08-12 17:05:57 IP:220.130.xxx.xxx 未訂閱
timhuang您好!! 剛剛試過用MS SQL是OK....不過用Postgre SQL還是一樣會把View秀出來... 覺得Postgre SQL好像把View也當成Table ..... 發表人 - minjiu 於 2004/08/12 17:18:43
Wesly
中階會員


發表:14
回覆:103
積分:53
註冊:2002-05-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-08-13 13:36:45 IP:218.170.xxx.xxx 未訂閱
不知道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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-08-16 11:34:20 IP:220.130.xxx.xxx 未訂閱
引言: 不知道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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-08-16 12:05:40 IP:203.95.xxx.xxx 未訂閱
幫 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-08-16 14:25:19 IP:220.130.xxx.xxx 未訂閱
非常感謝timhuang及Wesly前輩的熱心回答... 不過在Postgre SQL下,還是一樣會把View顯示出來,真是怪啊~~ Postgres SQL....真是搞不懂你啊 =.=
seaturn99
版主


發表:69
回覆:427
積分:214
註冊:2003-08-25

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-08-16 14:35:33 IP:220.130.xxx.xxx 未訂閱
引言: 非常感謝timhuang及Wesly前輩的熱心回答... 不過在Postgre SQL下,還是一樣會把View顯示出來,真是怪啊~~ Postgres SQL....真是搞不懂你啊 =.=
minjiu 您好 : 提供一個不優雅的方法(只能治標解決一些問題),將 View Table 與一般 table 命名的作區別,Ex : 將 View Table 以 vt_ 開頭 ... 在顯示的時候再濾掉... ---- 我只會兩件事,這也不會,那也不會 眼見不一定為真 ----
系統時間:2024-06-29 4:53:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!