找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3644|回复: 4

[原创] ADOLISP在64位系统上读取数据库的解决办法

[复制链接]
发表于 2013-8-25 21:49:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
第一步:确认64位系统上安装了64位的access驱动。安装office2010的64位版本或者去微软平台下载Access 2010的64位驱动(AccessDatabaseEngine_X64.exe)。这个驱动可以从下面的地址下载:
http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en

有些电脑上可能先装了32位的office,这样安装这个64位驱动时会提示报错,要求先卸载32位office后再安装。这样有两个做法,一种是先卸载office,安装64位驱动,再重装32位的office;另外一个做法,修改64位的驱动包,跳过检测了直接安装,更改方法:
先用7zip把AccessDatabaseEngine_X64.exe接压缩,里面会有一个AceRedist.msi安装文件,然后用Orca(下载地址http://www.technipages.com/wp-content/uploads/2007/11/orca.Msi)打开这个MSI,找到LaunchCondition里面的BLOCKINSTALLATION,删掉,保存。现在在运行AceRedist.msi,成功。

第二步:修改connectstring语句
具体代码我放在下面,这样更好理解些。具体修改的就是connectstring语句的组成。考虑到在64位系统下可以安装32位CAD和64位CAD,故结合平台判断语句一起控制。

[pcode=lisp,true]

;;;函数名:MECAD_ADOLib_ConnectString1
;;;输入变量:dbFile(打开数据库的路径名)
;;;输出值:ConnectString
;;;注释:使用ODBC(不需要DSN)连接MS-Access数据库,
;;;     示例: (MECAD_ADOLib_ConnectString1 "d:/dbfiles/products.mdb")
;;;设计者:
;;;设计日期:2013年8月
;;;修改者:
;;;修改日期:
(defun MECAD_ADOLib_ConnectString1 (dbFile / ConnectString proc_arch)
  (if (and
(setq proc_arch (getenv "PROCESSOR_ARCHITECTURE"))
(< 1 (strlen proc_arch))
(eq "64" (substr proc_arch (1- (strlen proc_arch))))
      )
    (progn
      (setq ConnectString
      (STRCAT
        "Provider=MSDASQL;"
        "Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
        "DBQ="
        dbFile
      )
      )     ;对于64位系统的数据库引擎连接
    )
    (progn
      (setq ConnectString
      (strcat
        "Provider=MSDASQL;"
        "Driver={Microsoft Access Driver (*.mdb)};"
        "DBQ="
        dbFile
      )
      )     ;对于32位系统的数据库引擎连接
    )
  )     ;end if
  ConnectString
)
;;;end if



;;;函数名:MECAD_ADOLib_ConnectString2
;;;输入变量:dbFile(打开数据库的路径名)
;;;输出值:ConnectString
;;;注释:使用JET4.0连接MS-Access数据库,64位系统上,JET引擎已不支持,需改用ACE引擎
;;;     示例: (MECAD_ADOLib_ConnectString2 "d:/dbfiles/products.mdb")
;;;设计者:
;;;设计日期:2013年8月
;;;修改者:
;;;修改日期:
(defun MECAD_ADOLib_ConnectString2 (dbFile / ConnectString proc_arch)
  (if (and
(setq proc_arch (getenv "PROCESSOR_ARCHITECTURE"))
(< 1 (strlen proc_arch))
(eq "64" (substr proc_arch (1- (strlen proc_arch))))
      )
    (progn
      (setq ConnectString
      (strcat "Provider=Microsoft.ACE.OLEDB.12.0;"
       "Data Source="
       dbFile
       ";Persist Security Info=False"
      )
      )     ;对于64位系统的数据库引擎连接
    )
    (progn
      (setq ConnectString
      (strcat "Provider=Microsoft.JET.OLEDB.4.0;"
       "Data Source="
       dbFile
       ";Persist Security Info=False"
      )
      )     ;对于32位系统的数据库引擎连接
    )
  )     ;end if
  ConnectString
)
;;;end if

;;;;测试函数的代码如下

(defun c:adotest (/ dbfile *ConnectionObject* result SQLStatement)
  (setq dbfile (getfiled "" "C:\\" "mdb" 4))
  (if dbfile
    (progn
      ;;打开MDB数据库
      (setq *ConnectionObject* (ADOLISP_ConnectToDB (MECAD_ADOLib_ConnectString1 dbfile) "" ""))
      ;(setq *ConnectionObject* (ADOLISP_ConnectToDB (MECAD_ADOLib_ConnectString2 dbfile) "" ""))
      (if *ConnectionObject*
(progn

   ;;数据库查询
   (setq result (ADOLISP_GetTablesAndViews *ConnectionObject*))
   ;;显示查询结果
   (print result)

   ;;关闭数据库
   (ADOLISP_DisconnectFromDB *ConnectionObject*)
)
      )
    )
  )
  (princ)
)


[/pcode]


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-25 22:48:43 | 显示全部楼层
顶楼主。看来楼主对LISP读取数据库研究颇深,希望以后多给大家分享下这方面的经验。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-8-26 08:28:38 | 显示全部楼层
access已经很复杂了,再加上lisp,难呀,楼上先讲点基础的给我听听吧。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3919个

财富等级: 富可敌国

发表于 2013-8-26 21:07:10 | 显示全部楼层
向高人学习经验!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2015-10-18 08:02:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-22 23:47 , Processed in 0.476752 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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