Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在没有ODBC DSN的数据库和DAO缓存连接中,是否将UID和PWD排除在ADO连接字符串之外?_Sql Server_Ms Access_Vba_Odbc_Ado - Fatal编程技术网

Sql server 在没有ODBC DSN的数据库和DAO缓存连接中,是否将UID和PWD排除在ADO连接字符串之外?

Sql server 在没有ODBC DSN的数据库和DAO缓存连接中,是否将UID和PWD排除在ADO连接字符串之外?,sql-server,ms-access,vba,odbc,ado,Sql Server,Ms Access,Vba,Odbc,Ado,我使用了Ben Clothier在其Office博客Power Tip()中的建议,使用缓存凭据创建一个无DSN连接,这样在访问界面中工作时,用户的UID和PWD就不会被保存,也不会多次被需要。有其他人这样做吗?如果是这样,当您需要使用ADO连接而不是DOA通过VBA从Access访问SQL时,您的方法是什么?如何打开adodb连接而不必再次提供用户ID和密码,或将其放入代码中? (我使用的是Access 2013前端、SQL 2008 R2后端、SQL Server安全) 提前谢谢 我的缓存连

我使用了Ben Clothier在其Office博客Power Tip()中的建议,使用缓存凭据创建一个无DSN连接,这样在访问界面中工作时,用户的UID和PWD就不会被保存,也不会多次被需要。有其他人这样做吗?如果是这样,当您需要使用ADO连接而不是DOA通过VBA从Access访问SQL时,您的方法是什么?如何打开adodb连接而不必再次提供用户ID和密码,或将其放入代码中? (我使用的是Access 2013前端、SQL 2008 R2后端、SQL Server安全) 提前谢谢

我的缓存连接代码如下所示:

Public Function InitConnect(strUserName As String, strPassword As String) As Boolean
' Description:  Is called in the application’s startup 
'               to ensure that Access has a cached connection
'               for all other ODBC objects’ use.

    Dim dbs As DAO.Database
    Dim qdf As DAO.QueryDef
    Dim rst As DAO.Recordset
    Dim strConnection As String


    strConnection = "ODBC;DRIVER=sql server;" & _
             "SERVER=******;" & _
             "APP=Microsoft Office 2010;" & _
             "DATABASE=******;" & _
             "Network=DBMSSOCN;"

    Set dbs = DBEngine(0)(0)
    Set qdf = dbs.CreateQueryDef("")
    With qdf
        .Connect = strConnection & _
             "UID=" & strUserName & ";" & _
             "PWD=" & strPassword & ";"
        .SQL = "Select Current_User;"

        Set rst = qdf.OpenRecordset(dbOpenSnapshot, dbSQLPassThrough)

   End With
    InitConnect = True

ExitProcedure:
    On Error Resume Next
        Set rst = Nothing
        Set qdf = Nothing
        Set dbs = Nothing
    Exit Function
End Function
然后,当我需要访问数据时,我可以这样做(注意UID和PWD不是必需的):

我还可以在Access或VBA中将ODBC连接设置为传递查询。但是,只有当连接字符串与缓存连接代码中最初使用的字符串相同时,这些连接才起作用。因此,当我需要ADODB连接时(有时似乎需要ADO),字符串显然是不相同的。
例如:

 Dim cn As New ADODB.Connection
 cn.Open "Provider = sqloledb;Data Source=*same as "SERVER"*;Initial Catalog=*same as "DATABASE"*;User Id=****;Password=****"

只有在提供用户Id和密码的情况下,这种类型的连接才有效。我怎么写才能不需要它们呢~谢谢

尽管ACCESS在安全性方面有一些弱点,但您可以做一些事情来最小化风险。其中之一是将DB编译为ACCDE。这样VBA就被编译而不可见了

您可以创建一个返回字符串的公共函数

Public Function GET_CONNECTION_STRING() as STRING
' construct your connection string here with server name and password
    GET_CONNECTION_STRING = "DRIVER={" & Driver & "};PORT=" & mPort & ";DATABASE=" & mDatabase & ";SERVER={" & mServer & "};UID=" & mUser & ";PWD={" & mPassword & "};"
End Function
然后创建一个在应用程序打开时运行的AutoExe宏。 在AutoExe中,刷新链接表的链接。类似于你所拥有的东西

For Each tdf In db.TableDefs
   If tdf.connect <> vbNullString Then
       tdf.connect = GET_CONNECTION_STRING & ";TABLE=" & tdf.name
       tdf.RefreshLink
    End If
Next tdf
此外,您还可以使用其他一些公共函数来获取当前登录的用户名。 差不多

public function getCrruserID() as int
   'check your public variable crr_user_id if its empty redirect to login
   if nz(crr_user_id,0) = 0 then
     'go to login and save the user id after successful login
   else
      getCrruserID = crr_user_id
   end if
end function
使用简单DAO执行sql代码,如

dim db as DAO.Database
set db = currentdb
dim rs as Dao.Recordset
set rs = db.openrecordset("select something from your linked table")

最后一个问题。如果您在内存中保存了某些内容,那么一旦应用程序关闭,它就会被销毁

编辑: 如果您有50多个链接表,那么在每次启动时刷新它们可能不是一个好主意。相反,您可以根据需要创建一个包含[Local_Appversion,isFreshInstall]和一些其他变量的本地表。每次用户收到更新时,freshInstall都将为true,并为应用程序编写代码,以连接和刷新所有表。(只是为了确保客户端将获得不间断的连接)

所以在你的autoExe代码中:如果它是freshInstall那么 连接并刷新链接(如果不只是设置connectionString)。(通常在登录后启动屏幕以执行此操作) 成功连接后,只需将本地isFreshInstall值更新为false,以便下次更快地启动

您还可以有一个专用菜单,用户可以在其中单击并手动刷新链接。(万一连接断开) 差不多

如果您的组织有一个域,您可以使用windows登录名允许可信连接
祝好运。

隐藏用户名和密码的最好方法是不使用用户名和密码:-如果可能的话,考虑使用(Windows身份验证)。我全心全意地同意迈克!问题是我在威斯康星州远程工作,我在伊利诺伊州有20多名用户,他们也在“工作”中工作,或者在家里或在路上的工作电脑上远程工作。因此,保留所有这些认证的后勤工作变得棘手。另外,我只是服务器上几个数据库的DBA—我上面的人不想处理身份验证的管理。我可能有一个可行的解决方案,但在我给出答案之前,有人看到这种方法的危险吗?我创建了两个公共变量“strUID”和“strPWD”,当用户单击我的登录屏幕时设置它们(例如,“strUID”Forms!FRM_login!txtserid”)。然后,每当需要使用ADO连接字符串时,我都会引用它们。我在这个编码世界里是个新手,所以我不想因为任何“新手”的错误而损害我用户的安全!谢谢大家!当我像上面的例子一样设置公共变量时,这些值是否以纯文本形式存储在任何地方?我是否需要在应用程序关闭时“擦除”公共变量?再次感谢!:)我已经读到使用TempVars(在access2007和更高版本中)比使用public/global变量要好,因为如果Access遇到错误,public/global变量会失去它们的值。TempVars没有,谢谢你,Krish!我不知道编译成ACCDE的选项——我一定会接受这个建议。如果我这样做,那么我使用的公共变量将不可见,并且在应用程序被销毁时将被销毁。此外,根据您的代码建议,这也是我在阅读上述Clothier博客之前开始使用的(另请参阅)。我不知道其中一个是否比另一个好,但似乎不必在登录时重新链接所有内容可能会更快。@LauraNorth在回复帖子中添加了一些建议。
public function getCrruserID() as int
   'check your public variable crr_user_id if its empty redirect to login
   if nz(crr_user_id,0) = 0 then
     'go to login and save the user id after successful login
   else
      getCrruserID = crr_user_id
   end if
end function
dim db as DAO.Database
set db = currentdb
dim rs as Dao.Recordset
set rs = db.openrecordset("select something from your linked table")
db.execute "update command", dbfailonerror