ADOLISP在64位系统上读取数据库的解决办法
本帖最后由 yj_hust 于 2013-8-25 21:58 编辑第一步:确认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,故结合平台判断语句一起控制。
;;;函数名: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)
)
搞不懂论坛的插入代码,咋有时可以,有时失效呢。。。 yj_hust 发表于 2013-8-25 21:59 static/image/common/back.gif
搞不懂论坛的插入代码,咋有时可以,有时失效呢。。。
看人品,我也没搞明白 刷新一下就行了。 最近正好我的程序也在升级到Win7 64位.
64位的程序访问必须使用楼主说的新的Access数据库访问引擎,但是32位的程序仍然可以使用Jet4.0来访问,不过有些客户的电脑就不行。
我看了一下ODBC中的数据库驱动,我电脑上也没有Jet 4.0的驱动,奇怪…… 本帖最后由 BDYCAD 于 2018-2-22 17:12 编辑
楼主我正在学习LISP中访问数据库的,然后遇到一个问题是改不了数据库里面的内容,特发上测试程序给你帮我指导一下,怎么处理的,谢谢!我测试的平台是64位的系统系统W10
修改应该不需要UPDATE,直接SET新的值就可以 本帖最后由 BDYCAD 于 2018-2-23 11:29 编辑
kozmosovia师傅你好, 我试了这样写(如下示例代码),可以把原来的'鞋舌面2'字符改成 '鞋舌面3' 了,谢谢,刚折腾会一点点了。
(progn;改数据库内容
(setq SQLStatement"UPDATE FP SET NameList='鞋舌面3' WHERE NameList='鞋舌面2'")
(setq Result (ADOLISP_DoSQL ConnectionObject SQLStatement))
)
页:
[1]