求助:本地Excel远程导入SQL

秋天之落叶 2019-03-01 04:33:42
连查询带瞎蒙,弄了两句,翻来覆去的提示错误:
insert into OPENDATASOURCE('SQLOLEDB','Data Source=xxx.x.xx.xxx;User ID=sa;Password=sa').hyzx.dbo.ceshi(a,b)
select a,b FROM OpenDataSource( 'Microsoft.ACE.OLEDB.12.0','Data Source="D:/test.xlsx";Extended properties="Excel 12.0;HDR=yes" ')...[Sheet1$]

消息 7314,级别 16,状态 1,第 7 行
链接服务器 "(null)" 的 OLE DB 访问接口 "Microsoft.ACE.OLEDB.12.0" 不包含表 "Sheet1$"。该表不存在,或者当前用户没有访问该表的权限。

insert into OPENDATASOURCE('SQLOLEDB.1','Data Source=xxx.x.xx.xxx;User ID=sa;Password=sa').hyzx.dbo.ceshi(a,b)
SELECT a,b from openrowset('Microsoft.ACE.OLEDB.12.0','excel 12.0;hdr=yes;imex=2;database="d:\test.xlsx"',[Sheet1$])

链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.ACE.OLEDB.12.0" 返回了消息 "不能更新。数据库或对象为只读。"。
消息 7303,级别 16,状态 1,第 8 行
无法初始化链接服务器“(null)”的 OLE DB 访问接口“Microsoft.ACE.OLEDB.12.0”的数据源对象。

哪位大神给看看,错在哪里,如何修改?
...全文
695 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋天之落叶 2019-05-17
  • 打赏
  • 举报
回复
终于搞明白了,哈哈哈
mestars 2019-03-08
  • 打赏
  • 举报
回复
那个文件地址是相对sql server服务器本地的。远程不能直接这么写,除非你把文件上传到服务器上。
jakefj 2019-03-05
  • 打赏
  • 举报
回复
select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)
秋天之落叶 2019-03-05
  • 打赏
  • 举报
回复
引用 12 楼 BlueStorm 的回复:
你在客户端执行insert命令,实际上就是简单地把insert命令提交给服务器,然后等待服务器执行命令并返回执行结果,期间客户端什么事情都没干,没有做任何读取你本地的文件数据提交给服务器的动作。

是这样了,我是刚刚领悟到这个道理,哈哈
BlueStorm 2019-03-05
  • 打赏
  • 举报
回复
你在客户端执行insert命令,实际上就是简单地把insert命令提交给服务器,然后等待服务器执行命令并返回执行结果,期间客户端什么事情都没干,没有做任何读取你本地的文件数据提交给服务器的动作。
BlueStorm 2019-03-05
  • 打赏
  • 举报
回复
你建立的连接sql server的connection,它只有发送sql命令和返回查询结果的功能,SQL server执行insert命令时是不可能通过这个connection取到你本地的文件的。excel文件的读取,是由服务器的SQL Server Service来做,不是由客户端软件来做。 因此SQL Server Service只能把文件名解释为SQL Server Service所能访问到的文件。
秋天之落叶 2019-03-05
  • 打赏
  • 举报
回复
多谢楼上前辈!又能回帖了。

果然,在局域网上测试,无论怎么写,本地数据库一切OK,已连接远程数据库,就报错,说明还是语句有问题。
同样导入文件,文件名、路径均相同,本地一份、远程一份,远程导入就能正常,删掉远程的文件,问题照旧。
所以,只要是远程数据库,不管在哪里导入文件,一律默认数据库本机寻找路径和文件,这大概就是网上几乎所有的例子都是运行不了的原因吧?
有请高手继续指教!
lyhoo163 2019-03-04
  • 打赏
  • 举报
回复
秋天之落叶 2019-03-04
  • 打赏
  • 举报
回复
是我想简单了,连接本地数据库,同样的Excel查询语句,怎么连接都没有问题。
但一改成远程连接,无论是查询还是插入记录,均提示错误:
链接服务器"(null)"的 OLE DB 访问接口 "Microsoft.ACE.OLEDB.12.0" 返回了消息 "“C:\Users\guth\Desktop\111.xlsx”不是一个有效的路径。确定路径名称拼写是否正确,以及是否连接到文件存放的服务器。
我想原因是,只要是远程数据库,它寻址肯定是数据库本机,而不是客户端寻址?
还请高手指教。
秋天之落叶 2019-03-03
  • 打赏
  • 举报
回复
引用 5 楼 BlueStorm 的回复:
如果你是偶尔导入excel表, 用sql server management studio的数据导入导出功能就可以了。右击目标数据库->任务->导入数据,数据源选择microsoft excel, 其他的按提示做就可以了

我不管应用,用的人也不会sql,要是我用,基本上不用写delphi代码,速度还快
秋天之落叶 2019-03-03
  • 打赏
  • 举报
回复
引用 4 楼 天行归来 的回复:
[quote=引用 3 楼 秋天之落叶 的回复:]
[quote=引用 2 楼 天行归来 的回复:]
可以把本地excel数据内容,通过ado读取出来,然后再写入远程数据库。这么做,你还可以在数据写入sqlserver前对数据做校验。

嗯,我也想先把excel导入到dbgrideh中,做一个校验,然后循环写入数据库,如果数据量大了这样是不是效率上有点差?或者直接用ADO速度快一点?还是直接用以上命令快一点?[/quote]
不需要UI,直接在记录集里操作,效率不会低。
过程如下:
1、读取Excel相应sheet页内容到AdoQuery获取其他第三方组件记录集;
2、记录集遍历并写入sqlserver(可以采用批量提交);[/quote]
嗯嗯,已经提交代码,明天测试一下效果,反正也是自己玩,不着急,哈哈
BlueStorm 2019-03-01
  • 打赏
  • 举报
回复
如果你是偶尔导入excel表, 用sql server management studio的数据导入导出功能就可以了。右击目标数据库->任务->导入数据,数据源选择microsoft excel, 其他的按提示做就可以了
天行归来 2019-03-01
  • 打赏
  • 举报
回复
引用 3 楼 秋天之落叶 的回复:
[quote=引用 2 楼 天行归来 的回复:]
可以把本地excel数据内容,通过ado读取出来,然后再写入远程数据库。这么做,你还可以在数据写入sqlserver前对数据做校验。

嗯,我也想先把excel导入到dbgrideh中,做一个校验,然后循环写入数据库,如果数据量大了这样是不是效率上有点差?或者直接用ADO速度快一点?还是直接用以上命令快一点?[/quote]
不需要UI,直接在记录集里操作,效率不会低。
过程如下:
1、读取Excel相应sheet页内容到AdoQuery获取其他第三方组件记录集;
2、记录集遍历并写入sqlserver(可以采用批量提交);
秋天之落叶 2019-03-01
  • 打赏
  • 举报
回复
引用 2 楼 天行归来 的回复:
可以把本地excel数据内容,通过ado读取出来,然后再写入远程数据库。这么做,你还可以在数据写入sqlserver前对数据做校验。

嗯,我也想先把excel导入到dbgrideh中,做一个校验,然后循环写入数据库,如果数据量大了这样是不是效率上有点差?或者直接用ADO速度快一点?还是直接用以上命令快一点?
天行归来 2019-03-01
  • 打赏
  • 举报
回复
可以把本地excel数据内容,通过ado读取出来,然后再写入远程数据库。这么做,你还可以在数据写入sqlserver前对数据做校验。
秋天之落叶 2019-03-01
  • 打赏
  • 举报
回复
SQL是2014,excel是2012

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧