sql在客户机上用服务器上的sql server用openrowset命令打开客户机上的access文件 (100分)

  • 主题发起人 江西的delphi
  • 开始时间

江西的delphi

Unregistered / Unconfirmed
GUEST, unregistred user!
C/S结构,由于程序在客户机上,当打开客户机上某一文件时,执行
Close;
Sql.Clear;
Sql.Add(' delete FROM OPENROWSET');
Sql.Add('(');
Sql.Add('''Microsoft.Jet.OlEDB.4.0''');
Sql.Add(',');
Sql.Add(''''+OpenDialog.FileName+'''');
Sql.Add(';');
Sql.Add('''userid'''+';'+'''pwd'''+','+'scj'+')');
Open;
假设OpenDialog.FileName是c:/sys.mdb
由于上述sql语句在服务器上的sql server的查询分析器上执行
所以sql server会找服务器上的文件c:/sys.mdb,
这就出问题了(我要的是客户机上的c:/sys.mdb)!
或通过网络路径//clientname/c/sys.mdb 这样有一个不好
就是要共享//clientname/c,而且要完全共享

所以不知道如何是好,请大家guan水。

谢谢。

 
干脆用sql explore 就行了
 
to:ugvanxk
我想在程序中执行这条语句,直接把sql server中的数据写到一个access文件中去!
 
请大侠出招!
 
你可以定义一个ODBC连接server端的MDB文件,然后直接写入就可以了,为什么还有去选择文件呢?
 
to:sword_liu,
mdb文件是用户选择的。每天都要选择不同的文件。
请祥细的点你的意思!
 
这个问题我也在想,关注!
 
在客户端执行时在ACCESS库中动态建立链接表(通过ODBC链接),
链接到服务器的SQL SERVER上,可以把数据导到ACCESS中了

离题了,原先没注意看题
 
恐怕只能用共享的那个办法,毕竟Access数据库是桌面数据库,当大型数据库用很困难,
除非你做成三层结构。
 
简单一些可以考虑用batchmove,或用dmo、bcp
我想这些都是可行的方案,大家可以照这些思路做一下,具体实现我还没有。
to QuickSilver:
可以一起做吗?
 
你若想用openRowset的方式来保存数据,那只能保存到服务器端,保存到另一台机器上,
SQL server不支持,你可以用MikeZ的思路来做了。
 
1、在客户机上动态建立ODBC连接到远程MS SQL上。
关于动态建立ODBC,DFW上已经有具体答案,请自己找找

2、Delphi程序中ADO连接到本地ACCESS上,在ADOQUERY中执行SQL语句,
实现本地ACCESS和远程MS SQL数据互导。

将远程MS SQL上的数据存到本地ACCESS数据库中
Select * into temp
From tablename in "" "ODBC;uid=sa;pwd=;DSN=awfi"

将本地ACCESS数据库的数据导到远程MS SQL
Select * into tablename in "" "ODBC;uid=sa;pwd=;DSN=awfi"
from temp

如ACCESS及MS SQL上表已经存在,改用Insert into SQL语句。
 
to:QuickSilver,
谢谢,回去再试!
 
用Select * from area in " " "ODBC;uid=sa;pwd=k552758;DSN=xx"

服务器: 消息 156,级别 15,状态 1,行 1
在关键字 'in' 附近有语法错误。
怎么回事,谢谢!

 
ADOQUERY.CONNECTION=>ADOCONNECTION=>ACCESS

SQL语句是要在ACCESS里执行的。
可以先在ACCESS里建立查询来验证上面的SQL语句。
 
to:QuickSilver
对,在ADOQUERY.CONNECTION=>ADOCONNECTION=>ACCESS可以,奇怪这条sql最终也应在
sql server上执行,但为什么直接在sql server的分析器上执行不行!
不对,是在access时里执行!


 
IN 子句

标识出外部数据库中的表,例如dBASE或Paradox数据库,或Microsoft Jet外部数据库,
Microsoft Jet数据库引擎能够与之相连。

只能ACCESS里使用,MS SQL不支持的。
 
顶部