如何利用Index Name找出對應的Field Name ? |
尚未結案
|
Mecer
初階會員 發表:15 回覆:30 積分:29 註冊:2002-10-25 發送簡訊給我 |
請教一下各位,在資料庫當中我們都會建立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_no,IX_custom_2找出對應的custom_name,custom_ename?還是得透過資料庫伺服器所提供的功能?
我的環境:
SQL Server 2000 Delphi 6.0 謝謝~
|
Mickey
版主 發表:77 回覆:1882 積分:1390 註冊:2002-12-11 發送簡訊給我 |
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 發送簡訊給我 |
引言:*********************************************************** 二個問題請教: 1. 若採三層式設計,Client端無TDataBase元件,如何取得DB.Handle ? 2. 經小弟測試後,發覺SQL Server的SysIndexes,SysIndexKeys,SysColumns三個Table可以用IndexName查出FieldName,不知道Oracle是否也可使用同樣的方法? 謝謝~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 |
huwk
資深會員 發表:26 回覆:340 積分:323 註冊:2002-04-03 發送簡訊給我 |
[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 發送簡訊給我 |
引言: *********************************************************** 二個問題請教: 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 發送簡訊給我 |
|
clin
一般會員 發表:1 回覆:2 積分:0 註冊:2002-09-14 發送簡訊給我 |
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
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |