设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

12下一页
返回列表 发新帖
查看: 3703|回复: 10
打印 上一主题 下一主题

[ADO/DAO] 如何在不建立外部链接表的情况下,如何把另一数据库的查询结果赋值给窗体的子窗体

[复制链接]
跳转到指定楼层
1#
发表于 2012-3-2 14:48:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有两个数据库,一个作为前台进行数据录入,保存和查询,一个作为后台数据。
为了实现多用户同时能进行连接操作,所以我准备用ADO 来连接数据库,进行数据的添加,更新等操作。

现在我想实现下面的功能,就是把 "DATA” 据库里的查询结果“订单汇总”,根据 "前台" 数据库 窗体 “订单查询”里的 店铺 和 产品 两个文本控件的条件删选后得到的记录集 Recordset, 赋值给订单查询的子窗体 --->“订单汇总子窗体“

望高手不吝指教!
谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
 楼主| 发表于 2012-3-5 09:41:33 | 只看该作者
谢谢 roych
3#
 楼主| 发表于 2012-3-5 14:56:20 | 只看该作者
谢谢roych!

最近我在做一个下数据库,我们是个小的服务型公司,做服务的工程师会在各个客户处工作。

我在公司设了服务器,通过花生壳的地址绑定,在外的员工可以通过VPN拨号连上公共盘。
现在要求在外的员工要及时把数据维护到服务器上的数据库,所以我准备在每个员工放一个前台数据库,后台数据放在服务器上。

考虑到ADSL上网的网速情况,如果都通过建立连接表,每次打开占用很多内存和带宽,感觉很慢。

所以现在准备,用ADO连接,获得记录集后,可以马上关闭链接。

或者你有什么好的推荐。
4#
 楼主| 发表于 2012-3-5 17:02:12 | 只看该作者
谢谢!
我会好好理解一下代码。

点击这里给我发消息

5#
发表于 2012-3-5 15:41:52 | 只看该作者
本帖最后由 鱼儿游游 于 2012-3-6 00:57 编辑

帮你写了以下代码:不用链接表读取ADO记录集,并在子窗体显示取回的ADO记录集,供楼主参考。
  1. Private Sub cmd查询_Click()
  2. On Error GoTo Err_Handler
  3.    
  4.     Dim rst     As Object
  5.     Dim strShop As String
  6.     Dim strProd As String
  7.     Dim strSQL  As String
  8.    
  9.     '关闭屏幕刷新
  10.     Application.Echo False
  11.     '设置鼠标指针为沙漏形状
  12.     DoCmd.Hourglass True
  13.    
  14.     '定义子窗体的数据源的SQL语句
  15.     Me.t店铺 = Trim(Nz(Me.t店铺, ""))
  16.     Me.t产品 = Trim(Nz(Me.t产品, ""))
  17.     strShop = IIf(Len(Me.t店铺) = 0, "%", "%" & Me.t店铺 & "%")
  18.     strProd = IIf(Len(Me.t产品) = 0, "%", "%" & Me.t产品 & "%")
  19.     strSQL = "SELECT 订单明细.店铺名称, 订单明细.产品, Sum(订单明细.规格1) as 规格1," _
  20.              & " Sum(订单明细.规格2) As 规格2, Sum(订单明细.规格3) As 规格3 FROM 订单明细" _
  21.              & " GROUP BY 订单明细.店铺名称, 订单明细.产品" _
  22.              & " HAVING 订单明细.店铺名称 Like '" & strShop & "' And 订单明细.产品 Like '" & strProd & "'"
  23.    
  24.     '设置子窗体的数据源
  25.     If GetRecordset(rst, strSQL, 1, 1) Then
  26.         SetFieldName True
  27.         Set Me.Controls("订单汇总子窗体").Form.Recordset = rst
  28.     Else
  29.          SetFieldName False
  30.     End If
  31.    
  32. Exit_Handler:
  33.     '恢复鼠标指针
  34.     DoCmd.Hourglass False
  35.     '打开屏幕刷新
  36.     Application.Echo True
  37.     Exit Sub
  38.    
  39. Err_Handler:
  40.     MsgBox Err.Descripton, vbExclamation, "读取数据"
  41.     Resume Exit_Handler
  42.    
  43. End Sub

  44. Private Sub SetFieldName(Optional ByVal blnDisplayRecordset As Boolean = True)
  45.     If blnDisplayRecordset Then
  46.         Forms!订单查询!订单汇总子窗体!t店铺名.ControlSource = "店铺名称"
  47.         Forms!订单查询!订单汇总子窗体!t产品.ControlSource = "产品"
  48.         Forms!订单查询!订单汇总子窗体!t规格1.ControlSource = "规格1"
  49.         Forms!订单查询!订单汇总子窗体!t规格2.ControlSource = "规格2"
  50.         Forms!订单查询!订单汇总子窗体!t规格3.ControlSource = "规格3"
  51.     Else
  52.         Forms!订单查询!订单汇总子窗体!t店铺名.ControlSource = ""
  53.         Forms!订单查询!订单汇总子窗体!t产品.ControlSource = ""
  54.         Forms!订单查询!订单汇总子窗体!t规格1.ControlSource = ""
  55.         Forms!订单查询!订单汇总子窗体!t规格2.ControlSource = ""
  56.         Forms!订单查询!订单汇总子窗体!t规格3.ControlSource = ""
  57.     End If
  58. End Sub
复制代码
调用函数如下:
  1. Option Compare Database '使用数据库的字符串比较方式
  2. Option Explicit         '变量在使用前必须进行显式声明

  3. '>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4. Public cn As Object '定义全程变量:数据链接对象(ADODB.Connection),用来保存连接数据库信息变量。
  5. '<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

  6. Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

  7. '=======================================
  8. ' 建立与后台数据库的链接(无链接表方式)
  9. '=======================================
  10. Public Function ADODB_Connect(Optional ByVal strDatabase As String = ".\Data.MDB", Optional ByVal strPwd As String = "") As Boolean
  11. On Error GoTo Err_ADODB_Connect
  12.    
  13.     Dim strConnect As String
  14.     strDatabase = Trim(Nz(strDatabase, ""))
  15.     '如果是简写的路径则转换为绝对路径
  16.     If strDatabase Like ".\*" Then strDatabase = CurrentProject.Path & Mid(strDatabase, 2)
  17.     '如果是相对路径则转换为绝对路径
  18.     If Left(strDatabase, 1) = "" Then strDatabase = Mid(CurrentProject.Path, 1, 2) & strDatabase
  19.     If Not strDatabase Like "[A-z]:*" Then strDatabase = CurrentProject.Path & "" & strDatabase
  20.     '定义ACCESS链接串
  21.     strConnect = "Provider=Microsoft.Jet.OLEDB.4.0" & ";Data Source=" & strDatabase & ";Jet OLEDB:Database Password=" & strPwd
  22.    
  23.     '用ADO通过OLEDB直接连接数据库
  24.     Set cn = Nothing
  25.     Set cn = CreateObject("ADODB.Connection")
  26.     cn.ConnectionString = strConnect
  27.     cn.CursorLocation = adUseClient
  28.     cn.ConnectionTimeout = 15
  29.     cn.CommandTimeout = 30
  30.     cn.Open
  31.     ADODB_Connect = True

  32. Exit_ADODB_Connect:
  33.     Exit Function

  34. Err_ADODB_Connect:
  35.     ADODB_Connect = False
  36.     MsgBox "连接后台数据库【" & strDatabase & "】失败!" \ Chr(10) & Chr(10) & "出错原因:" & Err.Description, 64, "出错信息"
  37.     '并释放变量
  38.     Set cn = Nothing
  39.     Resume Exit_ADODB_Connect

  40. End Function

  41. '=======================================
  42. ' 打开记录集
  43. '=======================================
  44. Public Function GetRecordset(ByRef rst As Object, _
  45.                              ByRef strSQL As String, _
  46.                              Optional ByRef intOpenKeyset As Integer = adOpenKeyset, _
  47.                              Optional ByRef intLockOptimistic As Integer = adLockReadOnly, _
  48.                              Optional ByRef IsCurrentMDB As Boolean = False) As Boolean
  49. On Error GoTo Err_GetRecordset

  50. RetryOpen:
  51.    '打开ADO记录集
  52.    Set rst = Nothing
  53.    Set rst = CreateObject("ADODB.Recordset")
  54.    If IsCurrentMDB Then
  55.        '当前MDB
  56.        rst.Open strSQL, CurrentProject.AccessConnection, intOpenKeyset, intLockOptimistic
  57.    Else
  58.        With rst
  59.            .Source = strSQL
  60.            .ActiveConnection = cn
  61.            .CursorLocation = adUseClient  '3
  62.            .CursorType = intOpenKeyset
  63.            .LockType = intLockOptimistic
  64.            .Open
  65.         End With
  66.     End If
  67.     GetRecordset = True
  68.     If rst.RecordCount > 0 Then rst.MoveFirst
  69. Exit_GetRecordset:
  70.     Exit Function
  71. Err_GetRecordset:
  72.     If Not IsCurrentMDB Then
  73.        Dim intCounter As Integer
  74.       '与数据库断开连接,则重新连接一次。
  75.        If Err.Number = 91 Or cn Is Nothing Then
  76.            If intCounter = 0 Then
  77.               intCounter = intCounter + 1
  78.               If ADODB_Connect Then Resume RetryOpen
  79.            End If
  80.        ElseIf Err.Number = 3709 Then
  81.            If intCounter = 0 Then
  82.               intCounter = intCounter + 1
  83.               Sleep 1000
  84.               Resume RetryOpen
  85.            End If
  86.        ElseIf Err.Number = -2147217865 Then
  87.            If intCounter = 0 Then
  88.               intCounter = intCounter + 1
  89.               Sleep 1000
  90.               Resume
  91.            End If
  92.        End If
  93.     End If
  94.     GetRecordset = False
  95.     '并释放变量
  96.     Set rst = Nothing
  97.     '显示错误信息
  98.     MsgBox Err.Description, vbExclamation, "打开记录集过程:GetRecordset"
  99.     Resume Exit_GetRecordset
  100. End Function
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
6#
 楼主| 发表于 2012-3-5 16:43:27 | 只看该作者
鱼儿游游
你能分享经验吗?

点击这里给我发消息

7#
发表于 2012-3-5 16:52:53 | 只看该作者
本帖最后由 鱼儿游游 于 2012-3-5 16:53 编辑
dulton 发表于 2012-3-5 16:43
鱼儿游游
你能分享经验吗?


附件已测试,不当之处请斧正。
8#
发表于 2012-3-4 12:15:00 | 只看该作者
本帖最后由 roych 于 2012-3-4 12:17 编辑

事实上DAO写起来比ADO更简单些许~~嗯,只是些许而已,所以我这里用DAO来完成。
  1. Private Sub cmd查询_Click()
  2. Dim rst As dao.Recordset
  3. Dim db As dao.Database
  4. Dim Shop As String, Prod As String, GetRow
  5. '定义查询条件
  6. If IsNull(Me.t店铺) Then
  7.     Shop = "'*'"
  8. Else
  9.     Shop = "'*" & Me.t店铺 & "*'"
  10. End If
  11. If IsNull(Me.t产品) Then
  12.     Prod = "'*'"
  13. Else
  14.     Prod = "'*" & Me.t产品 & "*'"
  15. End If
  16. '定义sql查询语句
  17. ssql = "SELECT 订单明细.店铺名称, 订单明细.产品, Sum(订单明细.规格1) as 规格1, " _
  18.     & "Sum(订单明细.规格2) As 规格2, Sum(订单明细.规格3) As 规格3 FROM 订单明细 " _
  19.     & "GROUP BY 订单明细.店铺名称, 订单明细.产品 " _
  20.     & "HAVING 订单明细.店铺名称 Like " & Shop & " And 订单明细.产品 Like " & Prod
  21. '打开数据库并连接记录集
  22. Set db = dao.OpenDatabase(CurrentProject.Path & "\data.mdb")
  23. Set rst = db.OpenRecordset(ssql)
  24. '绑定窗体数据源
  25. Set Me.订单汇总子窗体.Form.Recordset = rst
  26. Forms!订单查询!订单汇总子窗体!t店铺名.ControlSource = "店铺名称"
  27. Forms!订单查询!订单汇总子窗体!t产品.ControlSource = "产品"
  28. Forms!订单查询!订单汇总子窗体!t规格1.ControlSource = "规格1"
  29. Forms!订单查询!订单汇总子窗体!t规格2.ControlSource = "规格2"
  30. Forms!订单查询!订单汇总子窗体!t规格3.ControlSource = "规格3"
  31. End Sub
复制代码
此外,用老汉的In语句也是可行的,不过SQL查询语句写起来也挺麻烦的。这个就留给你做作业了。{:soso_e112:}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
9#
 楼主| 发表于 2012-3-4 09:28:49 | 只看该作者
SELECT 订单汇总.店铺名称, 订单汇总.产品, 订单汇总.规格1Sum, 订单汇总.规格2Sum, 订单汇总.规格3Sum
FROM 订单汇总  IN "d:\temp\ado\Data.mdb";

谢谢
10#
发表于 2012-3-3 16:45:32 | 只看该作者

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-14 15:41 , Processed in 0.094179 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表