设为首页收藏本站Access中国
Office中国(www.office-cn.net),专业Office论坛

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
楼主: yzt880

[Access本身] 记录企业erp软件编写点滴

[复制链接]
发表于 2013-8-20 16:59:34 | 显示全部楼层
chaosheng 发表于 2013-8-20 16:45
你说的MDB ODBC技术就是链接表了,把大型数据库的全部数据搬到客户端来,根本不是C/S方案,无安全性可谈 ...

,感觉你不清楚什么是MDB,什么是ADP.

ADP就是用ADO封装了的东西,这个东西没有什么神秘,事实已经证明这个玩意得不偿失丢掉了ACCESS许多优点,没有了本地表那还叫个屁的ACCESS. MDB中不管是用DAO+ODBC,还是ADO都是可以的。我要说的是ADP死掉了。

发表于 2013-8-20 17:06:08 | 显示全部楼层
本帖最后由 chaosheng 于 2013-8-20 19:47 编辑
gnoy 发表于 2013-8-20 16:59
,感觉你不清楚什么是MDB,什么是ADP.

ADP就是用ADO封装了的东西,这个东西没有什么神秘,事实已 ...

不是封装, 我上面都说过了. 是: ADP是基于ADO技术的.  

你说的MDB+ODBC其实就是用ODBC链接表把sql server的整个表搬到MDB中,再用跟MDB本身的表的同样方法来操纵,即用DAO操纵.
本地数据就没了安全性,大量数据就不行了.
 楼主| 发表于 2013-8-20 17:06:22 | 显示全部楼层
chaosheng 发表于 2013-8-20 16:49
是的,你这样也可以,就是麻烦点,但可充分发挥sql server功能,触发器,存储过程。。。

我使用access只使用窗体以后的部分,表和查询在access是没有的。链接表也没有。我在使用过程中感觉到那些链接表很麻烦,一旦更换了原来的网络环境,那些链接表就要重新连接。那个我做了一个专门连接程序。先建立dobc数据源,然后刷新连接:[ODBC]
DRIVER=SQL Server
UID=sa
PWD=123456
Trusted_Connection=no
DATABASE=ddb
WSID=192.168.1.3
APP=Microsoft Data Access Components
SERVER=192.168.0.6
这个是数据源,放在程序文件夹下面。这样很不安全,懂行打开一看就知道服务器全部信息。进入服务器很容易的。下面是创建数据源的代码:
Function Creat_SDSN()


    ' 查看我们要的系统数据源(DSN)是否存在。
    ' 如果存在,正好;否则,我们就创建一个。
         
    Dim lngKeyHandle As Long
    Dim lngResult As Long
    Dim lngCurIdx As Long
    Dim strvalue As String
    Dim classvalue As String
    Dim timevalue As String
    Dim lngvalueLen As Long
    Dim classlngvalueLen As Long
    Dim lngData As Long
    Dim lngDataLen As Long
    Dim strResult As String
    Dim DSNfound As Long
    Dim syscmdresult As Long


    syscmdresult = SysCmd(acSysCmdSetStatus, "查找系统DSN: " & JDS_DSN_name & " ...")
         
    ' 打开包含系统数据源(DSN)的注册表主键。
         
    lngResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _
                             "SOFTWARE\ODBC\ODBC.INI", _
                             0&, _
                             KEY_READ, _
                             lngKeyHandle)


    If lngResult <> ERROR_SUCCESS Then
        MsgBox "错误: 不能打开注册键 HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI." & _
               vbCrLf & vbCrLf & _
               "请安装SQL Server的ODBC驱动程序用以调用MDTS系统数据源。" & _
               vbCrLf & _
               "要获得更多的信息,请与管理员联系。"
        syscmdresult = SysCmd(acSysCmdClearStatus)
        Check_SDSN = -1
    End If
         
    ' 现在这个注册键是打开的,我们在这个查找看是否我们需要的。


    lngCurIdx = 0
    DSNfound = False
         
    Do
        lngvalueLen = 512
        classlngvalueLen = 512
        strvalue = String(lngvalueLen, 0)
        classvalue = String(classlngvalueLen, 0)
        timevalue = String(lngvalueLen, 0)
        lngDataLen = 512


        lngResult = RegEnumKeyEx(lngKeyHandle, _
                                 lngCurIdx, _
                                 strvalue, _
                                 lngvalueLen, _
                                 0&, _
                                 classvalue, _
                                 classlngvalueLen, _
                                 timevalue)
        lngCurIdx = lngCurIdx + 1


        If lngResult = ERROR_SUCCESS Then
         
            ' 是我们要的系统数据源吗?
         
            If strvalue = JDS_DSN_name Then
           
                ' 是! 那就不需要我们再做什么了。
            
                DSNfound = True
                syscmdresult = SysCmd(acSysCmdClearStatus)
               
            End If
           
        End If


    Loop While lngResult = ERROR_SUCCESS And Not DSNfound
         
    Call RegCloseKey(lngKeyHandle)


    If Not DSNfound Then
         
        ' 我们所需的系统数据源不存在,因此,我们试着创建一个。
         
        syscmdresult = SysCmd(acSysCmdSetStatus, "创建系统数据源DSN: " & JDS_DSN_name & "...")
         
        lngResult = SQLConfigDataSource(0, _
                                        ODBC_ADD_SYS_DSN, _
                                        "SQL Server", _
                                        "DSN=" & JDS_DSN_name & Chr(0) & _
                                        "Server=" & JDS_Server_name & Chr(0) & _
                                        "Database=ddb" & Chr(0) & _
                                        "UseProcForPrepare=Yes" & Chr(0) & _
                                        "Description=MDTS Database" & Chr(0) & Chr(0))
                       
        If lngResult = False Then
           
            MsgBox "错误: 不能创建系统数据源DSN: " & JDS_DSN_name & "." & _
                    vbCrLf & vbCrLf & _
                    "请确认已安装了SQL Server的ODBC驱动程序。" & _
                    vbCrLf & _
                    "需要更的有关MDTS的信息,请与系统管理员联系。"
                    
            syscmdresult = SysCmd(acSysCmdClearStatus)
            Check_SDSN = -1


        End If
           
    End If
         
    syscmdresult = SysCmd(acSysCmdClearStatus)
    Creat_SDSN = 0


End Function


发表于 2013-8-20 17:09:25 | 显示全部楼层
关于更多的ADP内容介绍,都是我收集的,还好还在,省的打字了。了解越多你就知道ADP死是应该的。 http://gnoysoft.haotui.com/forum ... r=type&typeid=1

 楼主| 发表于 2013-8-20 17:10:06 | 显示全部楼层
本帖最后由 yzt880 于 2013-8-20 17:30 编辑

这是调用代码,刷新链接表:
Function Check_SDSN1()
Dim lngKeyHandle As Long
    Dim lngResult As Long
    Dim lngCurIdx As Long
    Dim strvalue As String
    Dim classvalue As String
    Dim timevalue As String
    Dim lngvalueLen As Long
    Dim classlngvalueLen As Long
    Dim lngData As Long
    Dim lngDataLen As Long
    Dim strResult As String
    Dim DSNfound As Long
    Dim syscmdresult As Long



            
                DSNfound = True
                syscmdresult = SysCmd(acSysCmdClearStatus)
               
                Dim db As Database
                Dim tbl As TableDef
                Set db = CurrentDb
                    For Each tbl In db.TableDefs
                      If tbl.Attributes = 536870912 Then


   '=======================================


If Mid(ip_address, 9, 1) = 6 Then
RetVal = path & "\6.1.dsn"
Else
RetVal = path & "\jddb.dsn"
End If
Dim fwq1 As String
Dim sjk1 As String
Dim uid1 As String
Dim pwd1 As String
fwq1 = Forms![sqlconn]![fwq]
sjk1 = Forms![sqlconn]![sjk]
uid1 = Forms![sqlconn]![did]
pwd1 = Forms![sqlconn]![pwd]




     tbl.Connect = "FILEDSN=" & RetVal & ";UID=" & uid1 & "WD=" & pwd1 & ";LANGUAGE=us_english;" _
    & "DATABASE=" & sjk1 & ";"
                         tbl.RefreshLink
                      End If
                    Next
   Call RegCloseKey(lngKeyHandle)


    If Not DSNfound Then
         
        MsgBox "请先创建ODBC数据源!"
           
    End If
         
    syscmdresult = SysCmd(acSysCmdClearStatus)
    Check_SDSN1 = 0


End Function

连接完成后链接表中是这样显示的。











本帖子中包含更多资源

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

x
 楼主| 发表于 2013-8-20 17:16:42 | 显示全部楼层
本帖最后由 yzt880 于 2013-8-20 17:20 编辑

最后经过实际使用,达到我今天的使用习惯。
使用mdb窗体开发界面。ado代码连接sql,vba代码sql查询语句调用后台sql数据至前端。adp连接sql做视图,存储过程,触发器。


中午老板请吃饭,带着6个美女,加上我8个人。

点击这里给我发消息

发表于 2013-8-20 17:18:09 | 显示全部楼层
学习学习!
回复

使用道具 举报

发表于 2013-8-20 17:24:13 | 显示全部楼层
楼主,你6楼的就是ADO,为何后来又要用ODBC了?
发表于 2013-8-20 17:31:09 | 显示全部楼层
本帖最后由 gnoy 于 2013-8-20 17:32 编辑

ACCESS操作SQLSERVER用ADO全部来替换掉DAO+ODBC不是一件很容易的事情。在我看来微软的ADP就是想替换掉,但没想到漏洞百出,不说速度就连安全性也是没有的。(这个方面可以搜网络,攻破常开链接的内存即可)而且还白白丢掉了许多MDB优点,比如 主子窗体啊,你会发现ADP的主子窗体就是没有MDB好用,比如主窗体引用子窗体合计字段值,这个在ADP中就不行的。

其实检验功底就看一个例子就可以,弄出一个前端没有任何表和查询的 一对多窗体(主子窗体) 例子来即可。对照螺丝纹的订单来做即可。

一对多窗体需要集新增,修改,查找为一身功能。

 楼主| 发表于 2013-8-20 17:35:34 | 显示全部楼层
chaosheng 发表于 2013-8-20 17:24
楼主,你6楼的就是ADO,为何后来又要用ODBC了?

他们在讨论adp,dao,ado 我是说我以前做的东西是使用链接表的。说的是以前的东西。你很注意看呀,6楼说的就是现在的。我现在就使用这个。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /5 下一条

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

GMT+8, 2020-10-29 15:16 , Processed in 0.103637 second(s), 34 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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