Office中国论坛/Access中国论坛

标题: 求助:access表数据写入另一个access的表 [打印本页]

作者: access新新新手    时间: 2016-3-4 09:01
标题: 求助:access表数据写入另一个access的表
有1、access数据库(数据库名:数据库a ,表名:数据库a表)
有2、access数据库(数据库名:数据库b ,表名:数据库b表)
数据库在同一路径下,数据库字段完全相同(公司名、公司名简称、日期)
请问如何把数据库a中的数据库a表中的数据写入数据库b中的数据库b表中
[attach]58188[/attach]
作者: tmtony    时间: 2016-3-4 09:10
1。insert into b (select * from a in c:\a文件路径)
试试这种看看
2。 使用ADO 可连多个数据库,只要指定路径
作者: purplerose    时间: 2016-3-4 09:25
insert into [C:\另一个access数据库.mdb].一张表中
select [C:\数据库.mdb].一张表
where ......     大概是这个意思,不妨您试一下好吗!
作者: access新新新手    时间: 2016-3-4 09:33
tmtony 发表于 2016-3-4 09:10
1。insert into b (select * from a in c:\a文件路径)
试试这种看看
2。 使用ADO 可连多个数据库,只要指 ...

谢谢老大。
作者: access新新新手    时间: 2016-3-4 09:33
purplerose 发表于 2016-3-4 09:25
insert into [C:\另一个access数据库.mdb].一张表中
select [C:\数据库.mdb].一张表
where ......      ...

谢谢关注。
作者: roych    时间: 2016-3-4 11:47
本帖最后由 roych 于 2016-3-4 11:50 编辑
  1. Sub test1()
  2.     Dim rst1 As New ADODB.Recordset
  3.     Dim cnn2 As New ADODB.Connection
  4.     Dim rst2 As New ADODB.Recordset
  5.     Dim i As Long
  6.    
  7.     '如果不是在Access里执行,请将CurrentProject.Connection改为正确的连接字符串,具体请参考cnn2的的写法
  8.     rst1.Open "数据库a表", CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  9.     cnn2.Open "provider=Microsoft.jet.OLEDB.4.0;data source=" & CurrentProject.Path & "\数据库b.mdb"
  10.     rst2.Open "数据库b表", cnn2, adOpenKeyset, adLockOptimistic
  11.     Do Until rst1.EOF
  12.         rst2.AddNew
  13.         For i = 0 To rst1.Fields.Count - 1
  14.             rst2(i) = rst1(i)
  15.         Next
  16.         rst2.Update
  17.         rst1.MoveNext
  18.     Loop
  19.     rst2.Close
  20.     rst1.Close
  21. End Sub

  22. Sub test2()
  23. '简单点的写法
  24.     CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\数据库b.mdb].[数据库b表] select * FROM 数据库a表"
  25. End Sub
复制代码

[attach]58219[/attach]关于方法2,从理论上讲,对于数据库a表,是不需要使用绝对路径的。但手头上没有VB,暂时无法调试。

作者: access新新新手    时间: 2016-3-4 12:01
roych 发表于 2016-3-4 11:47
关于方法2,从理论上讲,对于数据库a表,是不需要使用绝对路径的。但手头上没有VB,暂时无法调试。

谢谢版主,在access中可以实现。
作者: access新新新手    时间: 2016-3-4 12:41
roych 发表于 2016-3-4 11:47
关于方法2,从理论上讲,对于数据库a表,是不需要使用绝对路径的。但手头上没有VB,暂时无法调试。

谢谢版主,在vb中可以实现了代码如下
Public cnn As New ADODB.Connection
Public rs As New ADODB.Recordset
Public cnn1 As New ADODB.Connection
Public rs1 As New ADODB.Recordset
Sub OpenCNN()
    Stpath = App.Path & "\数据库a.mdb"       '连接当前路径数据库
    cnn.Open "provider=Microsoft.jet.OLEDB.4.0;data source=" & Stpath & ""
    Stpath1 = App.Path & "\数据库b.mdb"       '连接当前路径数据库
    cnn1.Open "provider=Microsoft.jet.OLEDB.4.0;data source=" & Stpath1 & ""
End Sub
Sub main()
    On Error Resume Next
    Call OpenCNN
    SQL = "select * from 数据库a表"
    rs.Open SQL, cnn, adOpenStatic, adLockOptimistic
    SQL1 = "select * from 数据库b表"
    rs1.Open SQL1, cnn1, adOpenStatic, adLockOptimistic
    Do Until rs.EOF
        rs1.AddNew
        For i = 0 To rs.Fields.Count - 1
            rs1(i) = rs(i)
        Next
        rs1.Update
        rs.MoveNext
    Loop
    rs.Close '关闭记录集
    Set rs = Nothing '销毁数据库连接对象
    rs1.Close '关闭记录集
    Set rs1 = Nothing '销毁数据库连接对象
End Sub


作者: midmemory    时间: 2016-3-4 13:02
强悍的VBA运用啊,VBA——我的弱项啊...
作者: access新新新手    时间: 2016-3-4 13:32
roych 发表于 2016-3-4 11:47
关于方法2,从理论上讲,对于数据库a表,是不需要使用绝对路径的。但手头上没有VB,暂时无法调试。

再请教版主一个问题,您的代码前面的行号是怎么显示出来的。
作者: roych    时间: 2016-3-4 13:57
access新新新手 发表于 2016-3-4 13:32
再请教版主一个问题,您的代码前面的行号是怎么显示出来的。

这个行号是discuz!论坛自带的,使用了[code][/code]UBB标签就有了。如果需要在VBE界面上加行号,则需要手动处理。
sub test()
1:msgbox "test"
end sub
不过个人觉得没必要吧?
作者: access新新新手    时间: 2016-3-4 17:30
roych 发表于 2016-3-4 13:57
这个行号是discuz!论坛自带的,使用了[code][/code]UBB标签就有了。如果需要在VBE界面上加行号,则需要手 ...

是没有必要。
谢谢!
我按日期为条件,为什么提取不了数据
sql = "select * from 数据库a表 where 日期>=#" & DTPicker1.Value & "# and 日期<=#" & DTPicker2.Value & "# "
作者: roych    时间: 2016-3-5 08:54
access新新新手 发表于 2016-3-4 17:30
是没有必要。
谢谢!
我按日期为条件,为什么提取不了数据

1、请把DTPicker1.Value和DTPicker2.Value替换为其它包含记录的日期范围,创建一个查询看看有没有问题,例如:
select * from 数据库a表 where 日期>=#2016/2/1# and 日期<=#2016/2/29#
如果查不出来,那么则可能是日期字段有问题,请修改为正确的日期格式。

2、如果1没问题,请debug.print DTPicker1.Value和DTPicker2.Value出来看看是不是正确的日期范围。如果不是,请自行修改。

3、DateTimePicker我已经多年没用了,因为2007版本后就取消了这个控件。不过,以前用的时候,一般是通过该控件和文本框结合来使用的。通过DateTimePicker的change事件,把日期赋值给文本框,然后读取文本框的值来达到更改查询条件的目的的。例如:
private sub DTPicker1_change()
me.text1.value=DTPicker1
end sub
作者: access新新新手    时间: 2016-3-5 09:19
本帖最后由 access新新新手 于 2016-3-5 09:46 编辑

按 sql = "select * from 数据库a表  where 操作日期>=#2016/2/1# and 操作日期<=#2016/2/29#"
这种方法可以提取数据

估计跟DTPicker1.Value控件有关系,我发现在我的win7电脑里面时间显示为 年、月、日
但是一样的代码在我的XP电脑显示为 年、月、日、星期,多了一个星期,
不知道是不是这个原因。

作者: access新新新手    时间: 2016-3-5 12:11
roych 发表于 2016-3-5 08:54
1、请把DTPicker1.Value和DTPicker2.Value替换为其它包含记录的日期范围,创建一个查询看看有没有问题, ...

多谢版主,经过测试下面代码可以实现
sql = "select * from 数据库a表 where 操作日期>=#" & Format(Form1.DTPicker1.Value, "yyyy-mm-dd") & "# and 操作日期<=#" & Format(Form1.DTPicker2.Value, "yyyy-mm-dd") & "# "
作者: kent_73    时间: 2017-1-17 13:30
roych 发表于 2016-3-4 11:47
关于方法2,从理论上讲,对于数据库a表,是不需要使用绝对路径的。但手头上没有VB,暂时无法调试。

你好

那么在前台ACCESS,后台SQL SERVER的情况下,把SQL表的数据复制到ACCESS,这代码该怎么写?

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

''''以上都没问题,下面的代码提示找不到sql server上的表

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


谢谢!

作者: roych    时间: 2017-1-17 14:19
kent_73 发表于 2017-1-17 13:30
你好

那么在前台ACCESS,后台SQL SERVER的情况下,把SQL表的数据复制到ACCESS,这代码该怎么写?

好像没看到你的数据库链接字符串
作者: kent_73    时间: 2017-1-17 14:23
roych 发表于 2017-1-17 14:19
好像没看到你的数据库链接字符串

有的,没复制

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"
作者: roych    时间: 2017-1-18 13:42
kent_73 发表于 2017-1-17 14:23
有的,没复制

Dim rs As New ADODB.Recordset

试试把:
CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_temp] select * FROM " & ftbname & ""
改成:
cnn.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microsoft Office Access 应用程序.mdb].[Tb_查询_temp] select * FROM " & ftbname & ""
作者: kent_73    时间: 2017-1-18 16:09
roych 发表于 2017-1-18 13:42
试试把:
CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microso ...

改了就找不到本地表了。

对象名‘盘符:\新建 Microsoft Office Access 应用程序.mdb.tb_查询_temp'无效
作者: kent_73    时间: 2017-1-19 10:15
roych 发表于 2017-1-18 13:42
试试把:
CurrentProject.Connection.Execute "insert INTO [" & CurrentProject.Path & "\新建 Microso ...

你好

有什么方法把查询的结果,批量写入ACCESS表?
如:写入EXCEL是xlApp.Range("a1").CopyFromRecordset rs
作者: access新新新手    时间: 2017-1-27 22:41
kent_73 发表于 2017-1-18 16:09
改了就找不到本地表了。

对象名‘盘符:\新建 Microsoft Office Access 应用程序.mdb.tb_查询_temp'无 ...

目前我用的方法是access用代码链接表的方式链接到SQL Server数据库,先把本地表数据删除

再把链接表的数据写入本地表,然后删除链接表。




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