探索了很久,如何用程序语句方式,从sql server 中直接导出成指定目录下的dbf表呢?(50分)

  • 主题发起人 主题发起人 tuer
  • 开始时间 开始时间
T

tuer

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位高手,如何用程序语句方式,从sql server 中直接导出成指定目录下的dbf表?
程序写在delphi或sql server的存储过程里无所谓,我用过bcp了,好象生成的表fox不认
还有,我不想用执行sql server的dts包方法(因为不稳定,假使重装系统,不是又要重新
做包),有没有简洁直接的写法呢,请教大家了!
 

batchmove组件好像fox也不认
select * into newtab in "c:/data""dbase iv" from oldtab
试一下
 
不好意思忘了说,我也不想用batchmove组件,因为大表导的速度慢,并且还要定义ODBC,
万一重装系统就要记得去重新定义ODBC!
 
如果只是导出其数据及表结构的话,最简单的Query就可以实现
不过如果要导出触发器等这些东西就不行了。

大致这样,先用ADOQuery或者其它方法,把数据读到本地,然后
设定Query的DatabaseName为本地的一个目录,再在Query中用
Create Table来建立一个表,再入SQL语句将数据从上面的那个
ADOQuery中把数据导进来就可以了。会在本地生成一个dbf文件。
 
‘ugvanxk’说的方法试过了不行,好象tsql不支持这样的写法。
‘娃娃’说的“SQL语句将数据从上面的那个ADOQuery中把数据导进来”我有些不明白,在
两个query控件之间的sql语句怎样写,望写出源码看看。如果是做个循环一条一条的导入不
是我所想的,我的表记录量大,太慢。
 
高手在那里?
 
try this sql :
insert into aimtablename
(
field1,
field2
)
select
(
sourcetablename.field1,
sourcetablename.field2,
)
from sourcetablename;

至于 表名你则可以存储在一个stringlist中去循环,或者干脆存到一个数据库中。
 
let me test...
 
好像只有微软的 DAO 对象(即Jet数据引擎)可以支持异构数据库
之间的直接操作
select * into tablename in database("...=foxpro")
from table in database("...=msserver")

 
to:人在昆明
你的办法试过了,不行啊
 
to:Adanz
("...=foxpro")的...到底该怎么写,盼详细指点,还有,这句话写在sql server里还是
写在delphi的query控件里
 
我测试成功
 
应该使用支持DAO的控件,如 Diamond Access,或使用原生DAO对象.
这是DAO的SQL的特有语法,
如用过VB就很清楚.
 
这是一个异构查询问题,用一个Tquery即可解决。在窗体上放一个tquery控件,不要指定
它的DatabaseName,在SQL 属性中可参考如下格式:
INSERT INTO ":xhxt:XHB"(SHHM)
SELECT SHHM FROM ":tms6_gt:SHHM“
xhxt 为本地数据库别名XHB 为表名SHHM为本地字段名,tms6_gt 为sql 数据库别名
 
to:人在昆明 和大家

我是这样做的,在窗体上放了一个table控件(databasename我直接定为路径d∶/)、
一个adotable控件(用于直接连sql server,我就是不大想用odbc)、一个query控件
两个表做好数据库连接后,我在query的sql中写:
insert into table1 (字段1,字段2) select (adotabel1.字段1,adotabel1.字段2) from adotable1
然后执行query1.ExecSQL,结果程序报错:

invalid use of keyword
token:,adotabel1.字段1,adotabel1.字段2,adotabel1.字段3)
line number:1

我不知什么意思
 
将DBF表及SQL的表打开后,使用循环语句,将SQL表中的字段记录一条条赋值到DBF表中。
很简单的呀!我就是用此方法将SQL的表输出到DBF文件中,供旧系统的用户使用。
循环中间还可以加进度条,效果不错的。
 
基本同意luoyy2000的做法,但最好使用异步方式,可提高效率,我做过Informix数据库
倒入SQL中的程序。就是采用的这种方法.
 
不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分对象名的一部分。

语法
OPENDATASOURCE ( provider_name, init_string )

参数
provider_name

注册为用于访问数据源的 OLE DB 提供程序的 PROGID 的名称。provider_name 的数据类型为 char,没有默认值。

init_string

连接字符串,这些字符串将要传递给目标提供程序的 IDataInitialize 接口。提供程序字符串语法是以关键字值对为基础的,这些关键字值对由分号隔开,例如:"keyword1=value; keyword2=value."

在 Microsoft® Data Access SDK 中定义了基本语法。有关所支持的特定关键字值对的信息,请参见提供程序中的文档。下表列出 init_string 参数中最常用的关键字。

关键字 OLE DB 属性 有效值和描述
数据源 DBPROP_INIT_DATASOURCE 要连接的数据源的名称。不同的提供程序用不同的方法对此进行解释。对于 SQL Server OLE DB 提供程序来说,这会指明服务器的名称。对于 Jet OLE DB 提供程序来说,这会指明 .mdb 文件或 .xls 文件的完整路径。
位置 DBPROP_INIT_LOCATION 要连接的数据库的位置。
扩展属性 DBPROP_INIT_PROVIDERSTRING 提供程序特定的连接字符串。
连接超时 DBPROP_INIT_TIMEOUT 超时值,在该超时值后,连接尝试将失败。
用户 ID DBPROP_AUTH_USERID 用于该连接的用户 ID。
密码 DBPROP_AUTH_PASSWORD 用于该连接的密码。
目录 DBPROP_INIT_CATALOG 连接到数据源时的初始或默认的目录名称。


注释
OPENDATASOURCE 函数可以在能够使用链接服务器名的相同 Transact-SQL 语法位置中使用。因此,就可以将 OPENDATASOURCE 用作四部分名称的第一部分,该名称指的是 SELECT、INSERT、UPDATE 或 DELETE 语句中的表或视图的名称;或者指的是 EXECUTE 语句中的远程存储过程。当执行远程存储过程时,OPENDATASOURCE 应该指的是另一个 SQL Server。OPENDATASOURCE 不接受参数变量。

与 OPENROWSET 函数类似,OPENDATASOURCE 应该只引用那些不经常访问的 OLE DB 数据源。对于访问次数稍多的任何数据源,请为它们定义链接的服务器。无论 OPENDATASOURCE 还是 OPENROWSET 都不能提供链接的服务器定义的全部功能,例如,安全管理以及查询目录信息的能力。每次调用 OPENDATASOURCE 时,都必须提供所有的连接信息(包括密码)。

 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
867
DelphiTeacher的专栏
D
D
回复
0
查看
836
DelphiTeacher的专栏
D
D
回复
0
查看
785
DelphiTeacher的专栏
D
后退
顶部