Vba 将uid和pwd文件调用到系统dsn的access db中

Vba 将uid和pwd文件调用到系统dsn的access db中,vba,oracle,ms-access,dsn,Vba,Oracle,Ms Access,Dsn,我有5个不同的MS Access 2013 db文件,它们连接到系统dsn文件(链接服务器) 机器/系统dsn基于Oracle,但我遇到的问题是1我的密码没有加密,必须每90天更改一次,并且 2我必须打开每个文件,并在密码更改时多次保存密码 我希望有一个安全的位置,其中存储了凭据,并将其传递到access中,以便其他用户和用户看不到这些凭据 不必在每个access文件上保存密码并重新链接 我已经在谷歌上搜索了2天多,但除了查看连接字符串外,找不到其他任何东西,这仍然不能解决问题。我需要看什么来解

我有5个不同的MS Access 2013 db文件,它们连接到系统dsn文件(链接服务器) 机器/系统dsn基于Oracle,但我遇到的问题是1我的密码没有加密,必须每90天更改一次,并且 2我必须打开每个文件,并在密码更改时多次保存密码

我希望有一个安全的位置,其中存储了凭据,并将其传递到access中,以便其他用户和用户看不到这些凭据 不必在每个access文件上保存密码并重新链接

我已经在谷歌上搜索了2天多,但除了查看连接字符串外,找不到其他任何东西,这仍然不能解决问题。我需要看什么来解决这个问题

对不起,我没有代码,因为我只是在ms access中使用链接表向导

@Albert D我无法让您的代码正常工作,但我已经完成了以下工作,修复了表上的问题,但没有修复传递查询

创建了一个文件DSN并将一些表链接到access数据库。 创建了一个Excel文件来存储我的用户名和密码,但我在传递查询中的凭据仍然显示我被卡住了

Option Compare Database

Function Connections()
On Error Resume Next
'delete query if exists
DoCmd.DeleteObject acQuery, "PTQ"
Err.Clear
On Error GoTo 0 '"on error" statement here

'GET EXCEL LOGIN DETAILS
Set xlsApp = CreateObject("Excel.Application")
Dim WkBk As Excel.WorkBook
Set WkBk = xlsApp.WorkBooks.Open(FileName:="C:\folderlocation\filename.xlsx")

Dim USERLIST As String
Dim PWDLIST As String

USERLIST = WkBk.Sheets(1).Range("A2").Value
PWDLIST = WkBk.Sheets(1).Range("B2").Value

If Not (xlsApp Is Nothing) Then xlsApp.Quit
'end excel stuff
Dim db As DAO.Database
Dim qdExtData As QueryDef
Dim strSQL As String
Set db = CurrentDb
'passthrough query statement
strSQL = "SELECT * FROM table"
Set qdExtData = db.CreateQueryDef("PTQ")

ServerName = "Server1"
qdExtData.Connect = "ODBC;DRIVER={Oracle in OraClient11g_home1};Server=" & ServerName & ";DBQ=Server1;UID=" & USERLIST & ";Pwd=" & PWDLIST & ""

qdExtData.SQL = strSQL
qdExtData.Close
db.Close
Set db = Nothing
End Function
然后我设置了一个名为AutoExec的运行码宏

好的,首先? 我会避免(不使用)系统或用户DSN。原因很多,但这些类型的DSN不仅需要外部引用,而且通常还需要提升的注册表权限。更糟糕的是,您的密码将在普通视图中显示

最好的解决方案是使用所谓的无DSN连接。即使没有代码,您也可以创建这些连接

甚至更好?如果服务器+数据库名称未更改,但仅更改密码?您可以更改userID+密码,而无需重新链接表(非常适合更改密码,但不适合更改服务器+数据库)

更好吗?如果您采用一点点“登录”代码,那么您就不必在表链接中存储密码!如果有人决定启动access,并说导入链接表,这意味着什么?首先,他们将无法打开表,更好的是uid/密码不是的一部分,也不是存储在每个链接表的连接字符串中。如上所述,因此,您可以更改UID,而不必重新链接表

第一步: 首先,总是(但总是!)在链接表时,使用文件dsn。这很重要,因为在access中使用文件dsn时,它们会自动转换为无dsn连接

换句话说,如果您使用文件dsn链接表,那么一旦这些表被重新链接,您甚至可以删除或丢弃dsn。这意味着您可以将链接数据库(前端)部署到任何工作站。您不必在该工作站上设置DSN,实际上也不必设置任何内容。(当然,您将像以前一样需要oracle数据库驱动程序)

上面的意思是,当更新/更改密码时,您可以简单地推出一个新的前端。事实上,您的应用程序可能具有一些自动更新功能。(如果您不这么做,那么您可以(应该)拼凑一些代码来为您完成这项工作)。因此,您应该有一些方法来推出新版本的软件。毕竟,你真的必须在每个工作站上安装你的“应用程序”,就像你在所有其他软件上一样,对吗

因此,这里有两个部分: 为表链接采用文件dsn。如前所述,一旦这样做,就不再需要DSN了。这非常适合分发到每个工作站

另外,请确保在进行链接时,没有选中保存密码的复选框。这是为了确保连接字符串中未保存uid/密码

所以,如果表没有uid/密码,那么它们将如何工作? 那么,您要做的就是在启动代码中执行对数据库的“登录”。执行此登录后,所有链接表都将工作!正是这段“小”代码可以读取您放置在外部文件中的uid/密码。放置此uid/密码的位置由您决定。它可以是代码中的嵌入程序,甚至是启动时读取的一些外部文本文件。它甚至可以是前端的本地桌子。(如果你在推出下一个优秀版本的软件时有某种自动更新系统,这个想法会很好地发挥作用

因此,有了执行登录的能力,并且不必重新链接表,我们就有了更改密码的简单方法

因此,你必须: 少使用dsn。谢天谢地,access在默认情况下会这样做,但只有在您使用文件dsn时才会这样做

获取/获取登录数据库的代码。实际上,您可能需要删除所有表链接。退出Access,然后重新启动Access。现在,运行登录代码,然后重新链接表(使用您创建的文件dsn)

执行登录的代码如下:

函数TestLogin(strCon作为字符串)作为布尔值
关于错误转到测试器错误
Dim数据库作为DAO.Database
将qdf设置为DAO.QueryDef
设置dbs=CurrentDb()
设置qdf=dbs.CreateQueryDef(“”)
qdf.connect=strCon
qdf.ReturnsRecords=False
'在服务器上运行的任何有效SQL语句都将在下面运行。
qdf.sql=“选择1”
执行
TestLogin=True
退出功能
测试器错误:
TestLogin=False
退出功能
端函数
当然,上述操作需要格式正确的CONNECTON字符串

因此,为了完成所有这些工作,您可以采用文件dsn,并使用上面的。您可能会拼凑一些代码来构建一个连接字符串。然后在代码中添加一些代码来读取外部ext文件,或者在某些表中包含UID/密码。在使用或触摸任何表单或链接表之前,必须运行上面的登录代码

整个过程是模拟的