我們用SQL Server表作為數(shù)據(jù)源創(chuàng)建遠(yuǎn)程視圖時(shí), Visual FoxPro 會(huì)自動(dòng)把組成主索引關(guān)鍵字的字段的KeyField(關(guān)鍵字段)屬性設(shè)為真( .T. )。如何通過(guò)程序獲取主鍵的信息,以取得主鍵結(jié)構(gòu)的詳細(xì)內(nèi)容呢?我們可以使用存儲(chǔ)過(guò)程 sp—pkeys 來(lái)獲取。
SQL Server的存儲(chǔ)過(guò)程 sp—pkeys 可以返回標(biāo)明主鍵(PRIMARY KEY)設(shè)置的字段的信息。sp—pkeys 與 ODBC 中的SQLPrimaryKeys 功能相同。返回的結(jié)果按 TABLE—QUALIFIER, TABLE—OWNER, TABLE—NAME, KEY—SEQ的順序排列,返回的cursor的結(jié)構(gòu)如表1。
以下例程演示了sp—pkeys的具體應(yīng)用方法:
* GETKeys.prg
*實(shí)用時(shí)請(qǐng)用實(shí)際服務(wù)器名代替下面的服務(wù)器名
#DEFINE Connect—String ′DRIVER={SQL Server};SERVER=MY—SERVER;′ + ;
′DATABASE=PUBS;UID=sa;PWD=′
* 創(chuàng)建一個(gè)保存信息的 cursor
CREATE CURSOR SQLKeys (Table—Name C(128), Column—Name C(128), ;
Key—Seq I, PK—Name C(128))
* 連接 SQL Server
gnConnHandle=SQLSTRINGCONN(Connect—String)
IF gnConnHandle>0
* 取得SQL Server中可以使用的表數(shù)目
SQLConnTables=SQLTABLES(gnConnHandle)
IF SQLConnTables>0
SELECT SQLResult
INCnt=0
DO WHILE !EOF()
* 創(chuàng)建一個(gè)執(zhí)行存儲(chǔ)過(guò)程的命令字符串
SQLCommand=″sp—pkeys ″+ ALLTRIM(Table—Name)
* 執(zhí)行存儲(chǔ)過(guò)程,向cursor返回?cái)?shù)據(jù)
=SQLEXEC(gnConnHandle,SQLCommand,′syskeys′)
* 轉(zhuǎn)到cursor 所在工作區(qū)
SELECT SYSKeys
IF RECCOUNT()>0
SCAN
IF RECNO()=1
* 向 SQLKeys cursor 中插入新記錄
INSERT INTO SQLKeys ;
VALUES ;
(SYSKeys.Table—Name, SYSKeys.Column—Name, ;
SYSKeys.Key—Seq,SYSKeys.PK—Name)
ELSE
* 多字段主鍵
* 連接多字段形成索引表達(dá)式
SQLKeys.Column—Name WITH ;
ALLTRIM(SQLKeys.Column—Name) + ;
″+″ + ALLTRIM(SYSKeys.Column—Name)
ENDIF
ENDSCAN
ENDIF
SELECT SQLResult
SKIP
ENDDO
=SQLDISCONN(gnConnHandle)
ENDIF
ENDIF
SELECT SQLKeys
BROW LAST
CLOSE ALL
RETURN
以上程序適用于VFP 3.0以上各版本。
表1 字段名 說(shuō) 明
table_qualifier 表約束器的名稱(chēng),就是表所屬的數(shù)據(jù)庫(kù)的名稱(chēng),可以返回空值null。
table_owner 表所有者的名稱(chēng)。代表創(chuàng)建這個(gè)表的數(shù)據(jù)庫(kù)用戶的名稱(chēng),該字段總有返回值。
table_name 表的名稱(chēng)。該字段總有返回值。
column_name 字段名,包括table—name字段返回的表中的所有字段。本字段的內(nèi)容是在系統(tǒng)字段表(syscolumns)中登記的字段名,并且總有返回值。如果一個(gè)主鍵由多個(gè)字段組成,sp—pkeys會(huì)為組成主鍵索引表達(dá)式的每個(gè)字段都返回一行記錄。
key_seq 該字段在一個(gè)多字段主鍵中的順序編號(hào),總有返回值。
pk_name 主鍵標(biāo)識(shí)。如果它不適用于數(shù)據(jù)源,則返回空值null。
SQL Server的存儲(chǔ)過(guò)程 sp—pkeys 可以返回標(biāo)明主鍵(PRIMARY KEY)設(shè)置的字段的信息。sp—pkeys 與 ODBC 中的SQLPrimaryKeys 功能相同。返回的結(jié)果按 TABLE—QUALIFIER, TABLE—OWNER, TABLE—NAME, KEY—SEQ的順序排列,返回的cursor的結(jié)構(gòu)如表1。
以下例程演示了sp—pkeys的具體應(yīng)用方法:
* GETKeys.prg
*實(shí)用時(shí)請(qǐng)用實(shí)際服務(wù)器名代替下面的服務(wù)器名
#DEFINE Connect—String ′DRIVER={SQL Server};SERVER=MY—SERVER;′ + ;
′DATABASE=PUBS;UID=sa;PWD=′
* 創(chuàng)建一個(gè)保存信息的 cursor
CREATE CURSOR SQLKeys (Table—Name C(128), Column—Name C(128), ;
Key—Seq I, PK—Name C(128))
* 連接 SQL Server
gnConnHandle=SQLSTRINGCONN(Connect—String)
IF gnConnHandle>0
* 取得SQL Server中可以使用的表數(shù)目
SQLConnTables=SQLTABLES(gnConnHandle)
IF SQLConnTables>0
SELECT SQLResult
INCnt=0
DO WHILE !EOF()
* 創(chuàng)建一個(gè)執(zhí)行存儲(chǔ)過(guò)程的命令字符串
SQLCommand=″sp—pkeys ″+ ALLTRIM(Table—Name)
* 執(zhí)行存儲(chǔ)過(guò)程,向cursor返回?cái)?shù)據(jù)
=SQLEXEC(gnConnHandle,SQLCommand,′syskeys′)
* 轉(zhuǎn)到cursor 所在工作區(qū)
SELECT SYSKeys
IF RECCOUNT()>0
SCAN
IF RECNO()=1
* 向 SQLKeys cursor 中插入新記錄
INSERT INTO SQLKeys ;
VALUES ;
(SYSKeys.Table—Name, SYSKeys.Column—Name, ;
SYSKeys.Key—Seq,SYSKeys.PK—Name)
ELSE
* 多字段主鍵
* 連接多字段形成索引表達(dá)式
SQLKeys.Column—Name WITH ;
ALLTRIM(SQLKeys.Column—Name) + ;
″+″ + ALLTRIM(SYSKeys.Column—Name)
ENDIF
ENDSCAN
ENDIF
SELECT SQLResult
SKIP
ENDDO
=SQLDISCONN(gnConnHandle)
ENDIF
ENDIF
SELECT SQLKeys
BROW LAST
CLOSE ALL
RETURN
以上程序適用于VFP 3.0以上各版本。
表1 字段名 說(shuō) 明
table_qualifier 表約束器的名稱(chēng),就是表所屬的數(shù)據(jù)庫(kù)的名稱(chēng),可以返回空值null。
table_owner 表所有者的名稱(chēng)。代表創(chuàng)建這個(gè)表的數(shù)據(jù)庫(kù)用戶的名稱(chēng),該字段總有返回值。
table_name 表的名稱(chēng)。該字段總有返回值。
column_name 字段名,包括table—name字段返回的表中的所有字段。本字段的內(nèi)容是在系統(tǒng)字段表(syscolumns)中登記的字段名,并且總有返回值。如果一個(gè)主鍵由多個(gè)字段組成,sp—pkeys會(huì)為組成主鍵索引表達(dá)式的每個(gè)字段都返回一行記錄。
key_seq 該字段在一個(gè)多字段主鍵中的順序編號(hào),總有返回值。
pk_name 主鍵標(biāo)識(shí)。如果它不適用于數(shù)據(jù)源,則返回空值null。

