全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2174
推到 Plurk!
推到 Facebook!

各種判別資料表是否存在的方法(主要展示以ADOX方式判別)

 
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-27 14:13:41 IP:61.218.xxx.xxx 未訂閱
有時候我們在程式裡需要判斷某個資料表是否存在,當然有許多的方法 大部份的做法是從系統資料表判斷是否存在,例:  這是MSSQL 的做法
  Select Name from sysobjects where Name='Table_abc'
這是Access 的做法
  Select Name from Msysobjects where Name='Table_abc'
Access 需要先將權限打開,方法如下: (1)工具-->選項-->檢視-->系統物件 打勾 (2)工具-->保全-->使用者及群組的權限-->物件名稱-->MSysObjects-->權限(全部打勾) 如果沒有上述動作,程式會很無情的告訴你,權限不符 有沒有發現,很麻煩 好吧,我們換另一種方法,也是常常使用的 < class="code"> procedure TForm1.Button2Click(Sender: TObject); begin ADOQuery1.Connection:=ADOConnection1; try ADOQuery1.SQL.Text:='select count(*) from Table_abc'; ADOQuery1.Active:=True; ShowMessage('資料表存在') except ShowMessage('資料表不存在'); end; end; 這種方法是利用異常來判斷,若TABLE 不存在自然會引發異常。 最後一種方法,使用DAO 或是 ADOX 物件判別 我以ADOX 為例,寫了個Function 如下:
function chkTableExist(iConnect:TADOConnection;iTable:string):boolean;
//功能:此函式可以判斷資料表是否存在,是則傳回True
//說明:利用ADOX 物件判別(要引用ComObj 單元),以排除各資料庫系統差異(適用各種資料庫)
//作者:杜德一 (ddy)
//日期:2003/5/27
var
    i:integer;
    cat:Variant;
begin
    iConnect.Connected:=True;
    cat:=CreateOleObject('ADOX.Catalog');
    Cat.ActiveConnection := iConnect.ConnectionObject;
    Result:=False;
      For i := 0 To cat.Tables.Count - 1 do
      begin
        If UpperCase(cat.Tables.Item[i].Name) = UpperCase(iTable) Then
        begin
           Result:=True;
           Break;
        end;
      end;
end;
========使用範例============
procedure TForm1.Button1Click(Sender: TObject);
begin
   if chkTableExist(ADOConnection1,'Table_abc' ) then
      ShowMessage('資料表存在')
   else
      ShowMessage('資料表不存在');
end;
若有需要的歡迎參觀比較,如果有更好的做法也可以回應 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
Rain
資深會員


發表:31
回覆:236
積分:268
註冊:2003-02-17

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-27 18:33:27 IP:218.85.xxx.xxx 未訂閱
參照Delphi的代碼,下面的也是一種方法
function chkTableExist(iConnect: TADOConnection; iTable: string): Boolean;
var
  TypeField,
  NameField: TField;
  TableType: string;
  DataSet: TADODataSet;
begin
  Result := False;
  DataSet := TADODataSet.Create(nil);
  try
    with iConnect do
    begin
      if not Connected then Connected := True;
      OpenSchema(siTables, EmptyParam, EmptyParam, DataSet);
    end;
    TypeField := DataSet.FieldByName('TABLE_TYPE'); { do not localize }
    NameField := DataSet.FieldByName('TABLE_NAME'); { do not localize }
    while not DataSet.EOF do
    begin
      TableType := TypeField.AsString;
      if (TableType = 'TABLE') or (TableType = 'VIEW') then { do not localize }
      begin
        if UpperCase(iTable) = UpperCase(NameField.AsString) then
        begin
          Result := True;
          Break;
        end;
      end;
      DataSet.Next;
    end;
  finally
    DataSet.Free;
  end;
end;
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-27 23:27:49 IP:211.74.xxx.xxx 未訂閱
Rain 兄 不錯喔~~ 你的也是好方法 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
timhuang
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-27 23:58:46 IP:61.221.xxx.xxx 未訂閱
Rain 兄的方法就是修改 GetTableNames 的方法來進行比對. 我們也可以利用 GetTableNames 來取得所有的 table name. 如下:    
procedure TForm1.Button1Click(Sender: TObject);
var
  str: TStringList;
begin
  str:= TStringList.Create;
  ADOConnection1.GetTableNames(str);
  ShowMessage(str.Text);
  str.Free;
end;
之後就可以在 str 中找出是否有某 table 存在!!
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-05-28 00:06:00 IP:211.74.xxx.xxx 未訂閱
哈哈~~原本只是想貼出自己的心得,沒想到另有收獲…上了一課 < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-05-28 08:12:41 IP:218.163.xxx.xxx 未訂閱
select * from Table_abc 只為了檢查Table是否存在就 Select * 嗎-->效率最差的方法 開個玩笑你時間多嗎?
ddy
站務副站長


發表:262
回覆:2105
積分:1169
註冊:2002-07-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-05-28 09:01:36 IP:61.218.xxx.xxx 未訂閱
感謝ccchen 大哥提醒< > 愈電愈勇啦~~盡量電< > (叔叔是練過的…弟弟們不要學喔~~) < src="http://delphi.ktop.com.tw/loadfile.php?TOPICID=8147403&CC=182217">
系統時間:2024-05-20 20:07:27
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!