我正在使用MS ACCESS 2003,我需要通过MS ACCESS调用oracle存储过程。我正在使用传递查询来调用过程。我已经用ODBC的Microsoft驱动程序创建了用户DSN,并成功地调用了该过程。ODBC;DSN=DSN_NAME;UID=用户名;PWD=*******;DBQ=MY_SERVER
但我担心的是将密码保存在直通查询中,有时密码会更改,然后我每次都必须更改直通查询的连接字符串。
当密码更改时,是否有其他方法可以通过pass-through查询调用过程而不更改连接字符串,或者vba中是否有代码可以这样做。我正在寻找一种动态的方式,在这种方式中,调用过程将很容易,而无需通过访问其属性来更改每个通过查询的密码。谢谢
是的,这是可能的,但您需要知道,或者换句话说,能够在应用程序中以某种方式检索密码。在生产线应用程序中,您将使用用户(登录)密码创建一个连接字符串来访问后端表。
结构看起来与此类似:
- 创建一个模块来承载与连接相关的公共函数
- 创建新函数GET_CONNECTION_STRING()作为字符串:它将返回包括登录用户密码在内的连接字符串
- 循环浏览数据库中的表定义/查询定义,并更新.connect属性
- 在大多数情况下,您会更改.connect属性并使用.RefreshLink手动刷新/连接
- 您需要添加一个新的引用来使用DAO对象。(无论您想使用哪种类型的Microsoft dao对象,或activex数据对象或ado对象)
一些启动代码:
dim db as dao.database
set db = currentdb
dim tdf as dao.tabledef
For Each tdf In db.TableDefs
If tdf.connect <> vbNullString Then
tdf.connect = GET_CONNECTION_STRING & ";TABLE=" & tdf.name
'if you want to manually refresh uncomment below line
'tdf.refreshlink
End If
End If
Next tdf
将上述函数添加到启动宏将确保所有链接表(需要额外执行的查询)都使用最新的连接字符串进行更新。
当你陷入困境时,试着发布你的代码。
任何链接表以及在Access中包含"已保存"pass-the-quires的链接表都不需要在该字符串中包含密码。如果您省略了密码,那么单一登录到Oracle数据库将允许所有链接的表和pass-the-quires在没有密码的情况下运行。
第一步是将表设置为无DSN,并且不要包含密码(您可能最好删除现有的链接表)。
使用上面的链接但不包括密码意味着您必须首先执行数据库登录。完成后,您可以链接您的表并通过quires。因此,一个表的一次性链接为DSN少,你就可以参加比赛了。
完成以上操作后,任何和所有连接(包括直通查询)都将正常工作,而不必包括用户名。
因此,以上内容意味着您不必为登录到数据库的不同用户重新链接。
要运行直通查询,可以使用以下一行VBA代码:
CurrentDb.Execute.QueryDefs("MyPassQuery").Execute
如何与DNS less链接概述如下:http://www.accessmvp.com/djsteele/DSNLessLinks.html
如何"缓存"用户登录,而不需要用户+登录在链接的连接或用于传递的连接中,概述如下:
电源提示:提高数据库连接的安全性
http://blogs.office.com/b/microsoft-access/archive/2011/04/08/power-tip-improve-the-security-of-database-connections.aspx
因此,您可以在启动时执行一次登录,或提示用户登录,然后从那时起在您的应用程序上传递-=,尽管查询将在不需要密码的情况下运行。这也意味着你可以让不同的用户登录,而不必重新链接现有的表(并通过quires)。