Office中国论坛/Access中国论坛

标题: 如何从sql server数据库批量复制数据到本地ACCESS表 [打印本页]

作者: kent_73    时间: 2017-1-16 11:22
标题: 如何从sql server数据库批量复制数据到本地ACCESS表
求教,如何从sql server数据库批量复制数据到本地ACCESS表。用for循环,速度太慢了


'''''''把数据复制到本地临时表
Dim rs As New ADODB.Recordset
Set cnn = New ADODB.Connection
Set mydb = CurrentProject.Connection
cnn.Open "rovider=SQLOLEDB;Data Source=192.168.0.1;UID=saWD=******;initial catalog=SHUJUKU"
If rs.State = 1 Then rs.Close
sql = "SELECT 字段1,字段2,字段3 FROM mssql表 GROUP BY 字段1,字段2,字段3"
rs.Open sql, cnn, 1, 1
If rs.EOF = False Then
''''用for循环,速度太慢了
For i = 1 To rs.RecordCount
DoCmd.RunSQL "insert into access表(字段1,字段2,字段3) VALUES( '" & rs!字段1 & "' ,'" & rs!字段2 & "' ,'" & rs!字段3 & "')"
rs.MoveNext
Next
End If



帮我改下代码,谢谢了

作者: tmtony    时间: 2017-1-16 11:27
1.使用记录集 Rs.addnew 看看
2.如果 是一次性的,使用Sqlserver管理器的本身的直接导出到access
作者: kent_73    时间: 2017-1-16 11:37
数据是一次性的。
我是在执行代码的过程中,怎么调用Sqlserver管理器?
作者: access新新新手    时间: 2017-1-16 12:15
kent_73 发表于 2017-1-16 11:37
数据是一次性的。
我是在执行代码的过程中,怎么调用Sqlserver管理器?

一次性的可以用access链接SQL Server的表,

然后复制access的链接表为本地表

不需要代码
作者: kent_73    时间: 2017-1-16 12:48
access新新新手 发表于 2017-1-16 12:15
一次性的可以用access链接SQL Server的表,

然后复制access的链接表为本地表

这个是临时表数据,为了避免多人同时使用,sql server上的临时表名是动态的,无法链接表。
作者: access新新新手    时间: 2017-1-16 13:15
kent_73 发表于 2017-1-16 12:48
这个是临时表数据,为了避免多人同时使用,sql server上的临时表名是动态的,无法链接表。


    CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\数据库b.mdb].[数据库b表] select * FROM 数据库a表"

作者: kent_73    时间: 2017-1-16 13:51
access新新新手 发表于 2017-1-16 13:15
CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\数据库b.mdb].[数 ...

'''ftbname是动态表名
CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_temp] select * FROM " & ftbname & ""

执行后出现如图的错误

[attach]60684[/attach]




作者: 风中漫步    时间: 2017-1-16 14:02
动态表名是怎么个动态法呢?
作者: kent_73    时间: 2017-1-16 14:18
风中漫步 发表于 2017-1-16 14:02
动态表名是怎么个动态法呢?

变量=表名+用户名
作者: 风中漫步    时间: 2017-1-16 14:27
Tb_查询_temp_admin存在吗?
作者: kent_73    时间: 2017-1-16 14:41
风中漫步 发表于 2017-1-16 14:27
Tb_查询_temp_admin存在吗?

存在的。
完整的代码
Dim Cmd As New ADODB.Command
Dim param As ADODB.Parameter


''fuser是用户名的变量
ftbname = "Tb_查询_temp_" & fuser


Set Cmd = New ADODB.Command
Set param = Cmd.CreateParameter("@ftablename", adChar, adParamInput, 255, ftbname)
Cmd.Parameters.Append param


''''''删除临时表
rs.Open "SELECT name FROM sysobjects WHERE name = '" & ftbname & "'", cnn, 1, 1
If rs.EOF = False Then cnn.Execute = "DROP TABLE " & ftbname
If rs.State = 1 Then rs.Close
Cmd.CommandType = adCmdStoredProc
Cmd.ActiveConnection = cnn
Cmd.CommandText = "Dt_查询_temp"  ''''存储过程
Set rs = Cmd.Execute

CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_temp] select * FROM " & ftbname & ""


作者: 风中漫步    时间: 2017-1-16 14:58
If rs.EOF = False Then cnn.Execute = "DROP TABLE " & ftbname,注掉这句试试
作者: 风中漫步    时间: 2017-1-16 14:59
存储过程是在做什么?
作者: kent_73    时间: 2017-1-16 14:59
风中漫步 发表于 2017-1-16 14:58
If rs.EOF = False Then cnn.Execute = "DROP TABLE " & ftbname,注掉这句试试

需要通过存储过程创建表的,注释了会有问题的吧
作者: 风中漫步    时间: 2017-1-16 15:16
kent_73 发表于 2017-1-16 14:59
需要通过存储过程创建表的,注释了会有问题的吧

什么问题?
作者: kent_73    时间: 2017-1-16 15:23
风中漫步 发表于 2017-1-16 15:16
什么问题?

重复创建表

存储过程大致意思
创建临时表
得到结果并把结果写到创建的临时表中

由于数据量大,必须用存储过程来计算后放到临时表中
作者: 风中漫步    时间: 2017-1-16 15:36
Tb_查询_temp,这个表存在吗
作者: kent_73    时间: 2017-1-16 15:43
风中漫步 发表于 2017-1-16 15:36
Tb_查询_temp,这个表存在吗

存在的

整段代码,我是执行到
CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_temp] select * FROM " & ftbname & ""
出现错误

sql表[attach]60685[/attach]
access表
[attach]60686[/attach]





作者: 风中漫步    时间: 2017-1-16 15:55
改成"insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_temp] from select * FROM " & ftbname & ""试试
作者: kent_73    时间: 2017-1-16 15:59
风中漫步 发表于 2017-1-16 15:55
改成"insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_te ...

提示insert into语句的语法错误。
作者: 风中漫步    时间: 2017-1-16 16:22
CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_temp] select * FROM " & ftbname
这样呢?
作者: kent_73    时间: 2017-1-16 16:29
风中漫步 发表于 2017-1-16 16:22
CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Ac ...

说是找不到sql server上的表Tb_查询_temp_admin。

现在是我的存储过程执行结束了,表示肯定存在的。
作者: access新新新手    时间: 2017-1-16 16:33
kent_73 发表于 2017-1-16 16:29
说是找不到sql server上的表Tb_查询_temp_admin。

现在是我的存储过程执行结束了,表示肯定存在的。

这种是最快的,用循环数据大了很慢的


作者: kent_73    时间: 2017-1-17 08:20
access新新新手 发表于 2017-1-16 16:33
这种是最快的,用循环数据大了很慢的

是的,FOR循环太慢了。

但是这个又实现不了,求解啊
作者: access新新新手    时间: 2017-1-17 12:01
kent_73 发表于 2017-1-17 08:20
是的,FOR循环太慢了。

但是这个又实现不了,求解啊

慢慢调试,可以实现的,

这个可以把a数据表写入b数据库表的
作者: kent_73    时间: 2017-1-17 13:26
access新新新手 发表于 2017-1-17 12:01
慢慢调试,可以实现的,

这个可以把a数据表写入b数据库表的

CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_temp] select * FROM " & ftbname

这段代码是ACCESS表到ACCESS表吧。
我是从SQL SERVER表到ACCESS表。
作者: 风中漫步    时间: 2017-1-18 12:43
kent_73 发表于 2017-1-16 16:29
说是找不到sql server上的表Tb_查询_temp_admin。

现在是我的存储过程执行结束了,表示肯定存在的。

这也可能是游标设置问题,你修改一下游标类型试试看




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3