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

如何取得Table Schema ?

尚未結案
shiefu
一般會員


發表:3
回覆:6
積分:1
註冊:2003-09-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-12-28 17:06:11 IP:61.59.xxx.xxx 未訂閱
各位先進,我的DB是MS SQL 2000,使用Delphi7 ADOConnection,請問要如何取 得我的資料庫中的Constraint或是Index的名稱呢? (Table名稱叫Test,我有設一個複合主鍵Cust_No,Cust_Type,主鍵名稱PK_Customer,我想要知道我在資料庫中設定的主名稱)
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-12-28 17:45:19 IP:202.39.xxx.xxx 未訂閱
用 OpenSchema 做搜尋, 可以找到一點頭緒. -- 棒球是從兩出局開始的.
shiefu
一般會員


發表:3
回覆:6
積分:1
註冊:2003-09-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-12-28 18:02:37 IP:61.59.xxx.xxx 未訂閱
hagar兄: 我已經使用了這個Procedure,但在Run的時候有Error產生,在下的宣告如下 Var myschemainfo:TSchemaInfo; myrestriction,myschemaID:olevariant; begin adoconnection1.OpenSchema(mySchemaInfo,myrestriction,myschemaid,adodataset1); end; 因為Error訊息實在看不出來那個參數有問題(OLEVariant或TSchemaInfo),所以 只好救助各位有沒有其它的解,感謝您的回答,謝謝您!
hagar
版主


發表:143
回覆:4056
積分:4445
註冊:2002-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-12-28 18:10:30 IP:202.39.xxx.xxx 未訂閱
參考這篇看看: http://delphi.ktop.com.tw/topic.php?topic_id=37876 -- 棒球是從兩出局開始的.
James
高階會員


發表:10
回覆:290
積分:220
註冊:2002-07-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-12-28 21:38:59 IP:220.140.xxx.xxx 未訂閱
select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS
MorganBoy
一般會員


發表:14
回覆:75
積分:22
註冊:2003-04-30

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-12-29 07:13:35 IP:61.231.xxx.xxx 未訂閱
以下是我寫的資料庫轉移工具中的一段,參考看看。
function My_GetPKDataOK ( ThisConnection : TAdoConnection ;
                                 ThisTableName : string ;
                                 var rPKName : string ;
                                 var rPKFieldSSText : widestring ) : Boolean ;
                                 stdcall ;
        // =======================================================
        // 以 AdoConnection.openSchemaz抓某表格的PrimaryKey-TableName與
        //     此表PK的欄位清單﹝﹞以 TStrings-WideString格式傳回
        // rPKName 例: SaMen#PK
        // rPKFieldSSText:如pk為 'ID_No;ID_Name;Unit_ID_Code',則回傳
        //     由此三字串依序組成的 TStringS-WideString
        // 此在建或改相關表格的PrimaryKey-Constraint時很有用
        // 以上適用於 Paradox/Access/MSSQL,對PostgreSQL/MySQL應亦可
        // =======================================================
        var
            ThisAdoDataSet             : TAdoDataSet ;
            SS                         : TStringS ;
            II                         : integer ;
        begin
        ThisAdoDataSet := TAdoDataSet.Create(Application) ;
        SS := TStringList.Create ;
        try
            try
                Result := False ;
                My_ShowBusy ;
                ThisConnection.OpenSchema(
                                        My_GetSchemaInfo('siPrimaryKeys'),
                                        VarArrayOf([Unassigned]) , EmptyParam ,
                                        ThisAdoDataSet );
                if Not ThisAdoDataSet.Locate('Table_Name' ,Trim(ThisTableName),
                                        [loCaseInsensitive,loPartialKey]) then
                    exit ;
                rPKName := ThisAdoDataSet.FieldByName('PK_Name').AsString ;
                while AnsiCompareText(
                        Trim(ThisAdoDataSet.FieldByName('Table_Name').AsString),
                        Trim(ThisTableName)) = 0 do
                    begin
                    SS.Add (ThisAdoDataSet.FieldByname('Column_Name').AsString);
                    ThisAdoDataSet.Next ;
                    end ;
                rPKFieldSSText := SS.Text ;
                My_ShowBusy ( False ) ;
                Result := SS.Count > 0 ;
            except
                Result := False ;
            end ;
        finally
            SS.Free ;
            ThisAdoDataSet.Free ;
        end ;
        end ;
發表人 - morganboy 於 2004/12/29 07:17:46
shiefu
一般會員


發表:3
回覆:6
積分:1
註冊:2003-09-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2004-12-29 13:23:41 IP:61.59.xxx.xxx 未訂閱
感謝James及Hagar兄: James兄的方式,已經可以決解在下的問題了,非常感謝。另外Hagar兄提供的 資訊,在下也去試了一下,已經解決了Error發生的問題,應該是沒有問題,但 是小弟還有一問題,OpenSchema之後要怎麼得到在下要的資訊(pk的名稱)呢? 這一點不知道該如何得知,在下看了Help之後依然無頭緒,可否再煩請指點一、 二呢? 感激不盡
shiefu
一般會員


發表:3
回覆:6
積分:1
註冊:2003-09-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2004-12-29 13:43:26 IP:61.59.xxx.xxx 未訂閱
MorganBoy大大: 非常感謝您的解答,在下的大致上看的懂,但有My_GetSchemaInfo這個Function是啥用的,還不是很了解,可否再煩請說明下呢? 非常感謝您的說明,在下感激不盡,謝謝您!
James
高階會員


發表:10
回覆:290
積分:220
註冊:2002-07-25

發送簡訊給我
#9 引用回覆 回覆 發表時間:2004-12-29 21:42:16 IP:220.140.xxx.xxx 未訂閱
如果你真的要去用 OpenSchema 這個 method 的話, 那最好參考一下 MSDN 上面詳細的說明 ,至於 MorganBoy 兄所寫的函數, 我猜可能是要做一些 SchemaEnum 的對應 , 你可以對應以下的網址看看 , 應該是一樣的意思     http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdcstschemaenum.asp
MorganBoy
一般會員


發表:14
回覆:75
積分:22
註冊:2003-04-30

發送簡訊給我
#10 引用回覆 回覆 發表時間:2004-12-29 22:47:43 IP:61.231.xxx.xxx 未訂閱
就如James前輩講的,我寫的My_GetSchemaInfo('siPrimaryKeys')只是將字串的 'siPrimaryKeyS'轉為 Ado-OpenSchema所須的siPrimaryKetS參數而矣,只是作對照表罷了。 Ado-Openschema蠻好用,有時你要把幾個參數結果DataSet合起來互查才行。比如說 siColumns的DataType只是個Integer值,要知道這個值究竟是何種DataTYpe,你就要用 siProviderType的DataType去對回到 Type_Name﹝如Bit/Decimal/VarChar﹞才行。 發表人 - MorganBoy 於 2004/12/29 23:33:33
shiefu
一般會員


發表:3
回覆:6
積分:1
註冊:2003-09-22

發送簡訊給我
#11 引用回覆 回覆 發表時間:2004-12-30 15:11:36 IP:61.59.xxx.xxx 未訂閱
James及MorganBoy前輩,感謝您的回答,在下已經懂了,問題也解決了,再次感謝各位前輩的指導。
jeff377
初階會員


發表:9
回覆:60
積分:33
註冊:2004-08-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-01-28 15:10:56 IP:61.66.xxx.xxx 未訂閱
你可以使用SQL語法來查到相關索引資料 查詢主鍵 sp_pkeys [TableName] 查詢Index sp_helpindex [TableName]
系統時間:2024-06-24 19:51:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!