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

如何利用Index Name找出對應的Field Name ?

尚未結案
Mecer
初階會員


發表:15
回覆:30
積分:29
註冊:2002-10-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-02-20 13:00:55 IP:203.204.xxx.xxx 未訂閱
請教一下各位,在資料庫當中我們都會建立Index,並且給予名稱及指定對應的欄位,可能是1~N個欄位,如下: CREATE INDEX IX_custom_1 ON dbo.custom (custom_no) GO CREATE INDEX IX_custom_2 ON dbo.custom ((custom_name,custom_ename) GO 在Delphi當中,我要如何利用IX_custom_1找出對應的custom_noIX_custom_2找出對應的custom_name,custom_ename?還是得透過資料庫伺服器所提供的功能? 我的環境: SQL Server 2000 Delphi 6.0 謝謝~
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-02-20 14:36:58 IP:61.219.xxx.xxx 未訂閱
procedure fDbiOpenIndexList(DB: TDataBase;TableName:string;IndexList: TStrings);
var  TmpCursor: hdbicur;
     rslt: dbiResult;
     IndexDesc: IDXDesc;
     I : integer;
     FieldNames: string;
     FieldDefList: TStrings;
begin
  FieldDefList := TStringList.Create;
  try
  Check(DbiOpenIndexList(DB.Handle, PChar(TableName), nil, TmpCursor));
  IndexList.Clear;
  repeat
    rslt:= DbiGetNextRecord(TmpCursor, dbiNOLOCK, @IndexDesc, nil);
    if (rslt <> DBIERR_EOF) then with IndexDesc do begin
      DB.GetFieldNames(TableName,FieldDefList);
      FieldNames := '';
      for I := 0 to iFldsInKey - 1 do
        FieldNames := FieldNames FieldDefList[aiKeyFld[I] - 1] ';';
      IndexList.Add(StrPas(IndexDesc.szName) '=' Copy(FieldNames,1,Length(FieldNames)-1))
    end;
  until (rslt <> DBIERR_NONE);
  Check(DbiCloseCursor(TmpCursor));
  finally
    FieldDefList.Free;
  end;
end;
1. Using BDE. 2. IndexList.Name -> IndexName IndexList.Value -> ColumnMember /* Free 和 Create 一樣重要 */ 發表人 - Mickey 於 2003/02/20 15:16:33
Mecer
初階會員


發表:15
回覆:30
積分:29
註冊:2002-10-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-02-20 17:25:22 IP:203.204.xxx.xxx 未訂閱
引言:
procedure fDbiOpenIndexList(DB: TDataBase;TableName:string;IndexList: TStrings);
var  TmpCursor: hdbicur;
     rslt: dbiResult;
     IndexDesc: IDXDesc;
     I : integer;
     FieldNames: string;
     FieldDefList: TStrings;
begin
  FieldDefList := TStringList.Create;
  try
  Check(DbiOpenIndexList(DB.Handle, PChar(TableName), nil, TmpCursor));
  IndexList.Clear;
  repeat
    rslt:= DbiGetNextRecord(TmpCursor, dbiNOLOCK, @IndexDesc, nil);
    if (rslt <> DBIERR_EOF) then with IndexDesc do begin
      DB.GetFieldNames(TableName,FieldDefList);
      FieldNames := '';
      for I := 0 to iFldsInKey - 1 do
        FieldNames := FieldNames FieldDefList[aiKeyFld[I] - 1] ';';
      IndexList.Add(StrPas(IndexDesc.szName) '=' Copy(FieldNames,1,Length(FieldNames)-1))
    end;
  until (rslt <> DBIERR_NONE);
  Check(DbiCloseCursor(TmpCursor));
  finally
    FieldDefList.Free;
  end;
end;
1. Using BDE. 2. IndexList.Name -> IndexName IndexList.Value -> ColumnMember /* Free 和 Create 一樣重要 */ 發表人 - Mickey 於 2003/02/20 15:16:33
*********************************************************** 二個問題請教: 1. 若採三層式設計,Client端無TDataBase元件,如何取得DB.Handle ? 2. 經小弟測試後,發覺SQL Server的SysIndexes,SysIndexKeys,SysColumns三個Table可以用IndexName查出FieldName,不知道Oracle是否也可使用同樣的方法? 謝謝~
huwk
資深會員


發表:26
回覆:340
積分:323
註冊:2002-04-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-02-21 00:23:41 IP:210.58.xxx.xxx 未訂閱
[deleted..]    發表人 - Mickey 於 2003/02/20  15:16:33    *********************************************************** 二個問題請教: 1. 若採三層式設計,Client端無TDataBase元件,如何取得DB.Handle ?    由中間層處理所需的事務..讓client取所需資料就好啊. 2. 經小弟測試後,發覺SQL Server的SysIndexes,SysIndexKeys,SysColumns三個Table可以用IndexName查出FieldName,不知道Oracle是否也可使用同樣的方法? 謝謝~
------
熊的學習 http://huwk.blogspot.com
Mickey
版主


發表:77
回覆:1882
積分:1390
註冊:2002-12-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-02-21 08:56:36 IP:61.219.xxx.xxx 未訂閱
引言: *********************************************************** 二個問題請教: 1. 若採三層式設計,Client端無TDataBase元件,如何取得DB.Handle ? 2. 經小弟測試後,發覺SQL Server的SysIndexes,SysIndexKeys,SysColumns三個Table可以用IndexName查出FieldName,不知道Oracle是否也可使用同樣的方法? 謝謝~
1. Oracle : select sys.all_indexes / sys.all_ind_columns view 如 : 1.1 select index_name from sys.all_indexes where owner=user and table_name='[TableName]'; 1.2 SELECT COLUMN_NAME FROM SYS.ALL_IND_COLUMNS WHERE TABLE_OWNER = USER AND TABLE_NAME = '[TableName]' AND INDEX_OWNER = USER AND INDEX_NAME = '[IndexName]'; 2. 事實上, BDE 也只是下這些 SQL, 去 Get Schema Information, 當然也可自己下 SQL. 3. 用 SQL Monitor 去監看 SQL Explorer 就可知道 SQL 原碼, 挺方便的. /* Free 和 Create 一樣重要 */
Mecer
初階會員


發表:15
回覆:30
積分:29
註冊:2002-10-25

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-02-21 10:01:08 IP:203.204.xxx.xxx 未訂閱
多謝HUWK , Mickey的解答~
clin
一般會員


發表:1
回覆:2
積分:0
註冊:2002-09-14

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-12-26 17:41:19 IP:211.23.xxx.xxx 未訂閱
var FieldDefList: TStrings; begin FieldDefList := TStringList.Create; DB.GetFieldNames(TableName,FieldDefList); .... 如上 請問為什麼宣告為TStrings,卻用TStringList作Create呢? 我自己的寫法是這樣結果有問題..到底為什麼呢? 有前輩可以告訴我嗎? 謝謝 var List:TStrings; begin tsList:=TStringList.Create; DBP1.GetFieldNames('TestTable',tsList); llll
系統時間:2024-05-19 9:43:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!