各種判別資料表是否存在的方法(主要展示以ADOX方式判別) |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
有時候我們在程式裡需要判斷某個資料表是否存在,當然有許多的方法
大部份的做法是從系統資料表判斷是否存在,例:
這是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 發送簡訊給我 |
參照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 發送簡訊給我 |
|
timhuang
尊榮會員 發表:78 回覆:1815 積分:1608 註冊:2002-07-15 發送簡訊給我 |
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 發送簡訊給我 |
|
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
|
ddy
站務副站長 發表:262 回覆:2105 積分:1169 註冊:2002-07-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |