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

来源:互联网 发布:甬商贷网络贷款 编辑:程序博客网 时间:2024/06/11 01:44
第一步:确认64位系统上安装了64位的access驱动。安装office2010的64位版本或者去微软平台下载Access 2010的64位驱动(AccessDatabaseEngine_X64.exe)。这个驱动可以从下面的地址下载:(由于不能发链接,大家去百度找吧)
有些电脑上可能先装了32位的office,这样安装这个64位驱动时会提示报错,要求先卸载32位office后再安装。这样有两个做法,一种是先卸载office,安装64位驱动,再重装32位的office;另外一个做法,修改64位的驱动包,跳过检测了直接安装,更改方法:
先用7zip把AccessDatabaseEngine_X64.exe接压缩,里面会有一个AceRedist.msi安装文件,然后用Orca(下载地址:(由于不能发链接,大家去百度找吧))打开这个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]
0 0