在數(shù)據(jù)庫(kù)操作中,有時(shí)需要把SQL Server中的表拷貝到VFP表中。下面介紹通過編程,先生成與SQL Server表一致的VFP表結(jié)構(gòu),然后把數(shù)據(jù)從SQL Server表中拷貝到VFP表中。
要從SQL Server表向VFP表拷貝數(shù)據(jù),可以利用 SQLEXEC(),SQLTABLES()以及
⑴從SQL表中取得表的結(jié)構(gòu)信息;
⑵生成與SQL表結(jié)構(gòu)相同的VFP表;
⑶從SQL向VFP表拷貝數(shù)據(jù)。
示例代碼如下:
* 因?yàn)镾QL Server 表可能包含長(zhǎng)字段名,而VFP的自由表不支持長(zhǎng)字段名,只有數(shù)據(jù)庫(kù)中的表才能使用長(zhǎng)字段名。為了保存SQL Server表中的長(zhǎng)字段名,需要先建立一個(gè)數(shù)據(jù)庫(kù)CREATE DATABASE SQLDATA
* 建立一個(gè)包含表的信息的 cursor
CREATE CURSOR SYS_Tables (Table_Name c(128), Field_Name c(120), ;
Field_Type c(1), Field_len N(3,0), Field_Dec N(3,0))
* 建立一個(gè)連接到 SQL Server 服務(wù)器的連接字符串
* 使用時(shí)請(qǐng)用正確的服務(wù)器名稱代替下面文字中的對(duì)應(yīng)項(xiàng)
Connect_String=′DRIVER={SQL Server};Server=MY_Server;′+ ;
′DATABASE=PUBS;UID=sa;PWD=′
* 連接 SQL Server 服務(wù)器
gnConnHandle=SQLSTRINGCONNECT(Connect_String)
IF gnConnHandle〉0
*發(fā)送 USE 命令,打開 PUBS 數(shù)據(jù)庫(kù)
SQLCOMMAND="USE PUBS"
=sqlexec(gnConnHandle,SQLCOMMAND)
* 取得 SQL Server 中可以使用的表的數(shù)量
SQLConnTables=SQLTABLES(gnConnHandle)
IF SQLConnTables〉0
SELECT SQLResult
* 只操作表,所以SQL的條件子句中表類型 table_type參數(shù)設(shè)置為TABLE
* 否則取得系統(tǒng)表和視圖
SELECT Table_Name FROM SQLResult ;
WHERE UPPER(ALLTRIM(Table_Type))="TABLE" ;
INTO CURSOR SQL_Tables
SELECT SQL_Tables
INCnt=0
DO WHILE !EOF()
* 生成一個(gè)執(zhí)行存貯過程的命令字符串
SQLCOMMAND="SELECT * FROM " + ALLTRIM(Table_Name)
* 執(zhí)行存儲(chǔ)過程,取得數(shù)據(jù)放到臨時(shí) cursor
=sqlexec(gnConnHandle,SQLCOMMAND,′tmp_sys_data′)
* 選擇包含數(shù)據(jù)的 cursor
SELECT tmp_sys_data
* 使用 DBF()函數(shù)取得臨時(shí)文件的實(shí)際名稱
this_file=DBF()
* 用 AFIELDS() 函數(shù)取得字段名和字段屬性
=AFIELDS(test_vals)
* 字段數(shù)據(jù)保存到數(shù)組 maketab 中
DIMENSION maketab[alen(test_vals,1),6]
* 用字段數(shù)據(jù)填充數(shù)組元素
FOR i=1 TO ALEN(test_vals,1)
maketab[i,1]=test_vals[i,1]
maketab[i,2]=test_vals[i,2]
maketab[i,3]=test_vals[i,3]
maketab[i,4]=test_vals[i,4]
maketab[i,5]=test_vals[i,5]
maketab[i,6]=test_vals[i,6]
NEXT
* 根據(jù)數(shù)組 maketab 建立表,先建立命令字符串,然后用宏替換執(zhí)行
Execute_Cmd="CREATE TABLE "+ALLTRIM(SQL_Tables.Table_Name)+ ;
" FROM ARRAY maketab"
&Execute_Cmd
* 選中新建立的表
current_table=ALLTRIM(SQL_Tables.Table_Name)
SELECT (current_table)
* 從臨時(shí)文件中填加數(shù)據(jù)
APPEND FROM &this_file
SELECT SQL_Tables
SKIP
ENDDO
=SQLDISCONN(gnConnHandle)
ENDIF
ENDIF
SELECT SQL_Tables
CLOSE ALL
USE AUTHORS
BROWSE TIMEOUT 15
CLOSE ALL
RETURN
上面的代碼執(zhí)行后會(huì)生成一個(gè)名為Sqldata.dbc 的VFP數(shù)據(jù)庫(kù),庫(kù)中包含的表是SQL
要從SQL Server表向VFP表拷貝數(shù)據(jù),可以利用 SQLEXEC(),SQLTABLES()以及
⑴從SQL表中取得表的結(jié)構(gòu)信息;
⑵生成與SQL表結(jié)構(gòu)相同的VFP表;
⑶從SQL向VFP表拷貝數(shù)據(jù)。
示例代碼如下:
* 因?yàn)镾QL Server 表可能包含長(zhǎng)字段名,而VFP的自由表不支持長(zhǎng)字段名,只有數(shù)據(jù)庫(kù)中的表才能使用長(zhǎng)字段名。為了保存SQL Server表中的長(zhǎng)字段名,需要先建立一個(gè)數(shù)據(jù)庫(kù)CREATE DATABASE SQLDATA
* 建立一個(gè)包含表的信息的 cursor
CREATE CURSOR SYS_Tables (Table_Name c(128), Field_Name c(120), ;
Field_Type c(1), Field_len N(3,0), Field_Dec N(3,0))
* 建立一個(gè)連接到 SQL Server 服務(wù)器的連接字符串
* 使用時(shí)請(qǐng)用正確的服務(wù)器名稱代替下面文字中的對(duì)應(yīng)項(xiàng)
Connect_String=′DRIVER={SQL Server};Server=MY_Server;′+ ;
′DATABASE=PUBS;UID=sa;PWD=′
* 連接 SQL Server 服務(wù)器
gnConnHandle=SQLSTRINGCONNECT(Connect_String)
IF gnConnHandle〉0
*發(fā)送 USE 命令,打開 PUBS 數(shù)據(jù)庫(kù)
SQLCOMMAND="USE PUBS"
=sqlexec(gnConnHandle,SQLCOMMAND)
* 取得 SQL Server 中可以使用的表的數(shù)量
SQLConnTables=SQLTABLES(gnConnHandle)
IF SQLConnTables〉0
SELECT SQLResult
* 只操作表,所以SQL的條件子句中表類型 table_type參數(shù)設(shè)置為TABLE
* 否則取得系統(tǒng)表和視圖
SELECT Table_Name FROM SQLResult ;
WHERE UPPER(ALLTRIM(Table_Type))="TABLE" ;
INTO CURSOR SQL_Tables
SELECT SQL_Tables
INCnt=0
DO WHILE !EOF()
* 生成一個(gè)執(zhí)行存貯過程的命令字符串
SQLCOMMAND="SELECT * FROM " + ALLTRIM(Table_Name)
* 執(zhí)行存儲(chǔ)過程,取得數(shù)據(jù)放到臨時(shí) cursor
=sqlexec(gnConnHandle,SQLCOMMAND,′tmp_sys_data′)
* 選擇包含數(shù)據(jù)的 cursor
SELECT tmp_sys_data
* 使用 DBF()函數(shù)取得臨時(shí)文件的實(shí)際名稱
this_file=DBF()
* 用 AFIELDS() 函數(shù)取得字段名和字段屬性
=AFIELDS(test_vals)
* 字段數(shù)據(jù)保存到數(shù)組 maketab 中
DIMENSION maketab[alen(test_vals,1),6]
* 用字段數(shù)據(jù)填充數(shù)組元素
FOR i=1 TO ALEN(test_vals,1)
maketab[i,1]=test_vals[i,1]
maketab[i,2]=test_vals[i,2]
maketab[i,3]=test_vals[i,3]
maketab[i,4]=test_vals[i,4]
maketab[i,5]=test_vals[i,5]
maketab[i,6]=test_vals[i,6]
NEXT
* 根據(jù)數(shù)組 maketab 建立表,先建立命令字符串,然后用宏替換執(zhí)行
Execute_Cmd="CREATE TABLE "+ALLTRIM(SQL_Tables.Table_Name)+ ;
" FROM ARRAY maketab"
&Execute_Cmd
* 選中新建立的表
current_table=ALLTRIM(SQL_Tables.Table_Name)
SELECT (current_table)
* 從臨時(shí)文件中填加數(shù)據(jù)
APPEND FROM &this_file
SELECT SQL_Tables
SKIP
ENDDO
=SQLDISCONN(gnConnHandle)
ENDIF
ENDIF
SELECT SQL_Tables
CLOSE ALL
USE AUTHORS
BROWSE TIMEOUT 15
CLOSE ALL
RETURN
上面的代碼執(zhí)行后會(huì)生成一個(gè)名為Sqldata.dbc 的VFP數(shù)據(jù)庫(kù),庫(kù)中包含的表是SQL