返回
中国计算机报1999年第49期

从SQL Server向VFP拷贝表

张 猛

   在数据库操作中,有时需要把SQL Server中的表拷贝到VFP表中。下面介绍通过编程,先生成与SQL Server表一致的VFP表结构,然后把数据从SQL Server表中拷贝到VFP表中。

  要从SQL Server表向VFP表拷贝数据,可以利用 SQLEXEC(),SQLTABLES()以及AFIELDS()这些函数,步骤是:

  ⑴从SQL表中取得表的结构信息;

  ⑵生成与SQL表结构相同的VFP表;

  ⑶从SQL向VFP表拷贝数据。

  示例代码如下:

  * 因为SQL Server 表可能包含长字段名,而VFP的自由表不支持长字段名,只有数据库中的表才能使用长字段名。为了保存SQL Server表中的长字段名,需要先建立一个数据库容器。

  CREATE DATABASE SQLDATA

  * 建立一个包含表的信息的 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))

  * 建立一个连接到 SQL Server 服务器的连接字符串

  * 使用时请用正确的服务器名称代替下面文字中的对应项

  Connect_String=′DRIVER={SQL Server};Server=MY_Server;′+ ;

  ′DATABASE=PUBS;UID=sa;PWD=′

  * 连接 SQL Server 服务器

  gnConnHandle=SQLSTRINGCONNECT(Connect_String)

  IF gnConnHandle〉0

  *发送 USE 命令,打开 PUBS 数据库

  SQLCOMMAND="USE PUBS"

  =sqlexec(gnConnHandle,SQLCOMMAND)

  * 取得 SQL Server 中可以使用的表的数量

  SQLConnTables=SQLTABLES(gnConnHandle)

   IF SQLConnTables〉0

   SELECT SQLResult

  * 只操作表,所以SQL的条件子句中表类型 table_type参数设置为TABLE

  * 否则取得系统表和视图

SELECT Table_Name FROM SQLResult ;

WHERE UPPER(ALLTRIM(Table_Type))="TABLE" ;

   INTO CURSOR SQL_Tables

   SELECT SQL_Tables

   INCnt=0

   DO WHILE !EOF()

   * 生成一个执行存贮过程的命令字符串

  SQLCOMMAND="SELECT * FROM " + ALLTRIM(Table_Name)

  * 执行存储过程,取得数据放到临时 cursor

=sqlexec(gnConnHandle,SQLCOMMAND,′tmp_sys_data′)

  * 选择包含数据的 cursor

  SELECT tmp_sys_data

  * 使用 DBF()函数取得临时文件的实际名称

  this_file=DBF()

  * 用 AFIELDS() 函数取得字段名和字段属性

  =AFIELDS(test_vals)

  * 字段数据保存到数组 maketab 中

  DIMENSION maketab[alen(test_vals,1),6]

  * 用字段数据填充数组元素

  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

   * 根据数组 maketab 建立表,先建立命令字符串,然后用宏替换执行

   Execute_Cmd="CREATE TABLE "+ALLTRIM(SQL_Tables.Table_Name)+ ;

   " FROM ARRAY maketab"

   &Execute_Cmd

   * 选中新建立的表

  current_table=ALLTRIM(SQL_Tables.Table_Name)

  SELECT (current_table)

  * 从临时文件中填加数据

  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

  上面的代码执行后会生成一个名为Sqldata.dbc 的VFP数据库,库中包含的表是SQL Server的PUBS数据库中的表。