Ms access 传递查询中的变量';ODBC连接Str';

Ms access 传递查询中的变量';ODBC连接Str';,ms-access,Ms Access,我试图在Microsoft Access中的SQL直通查询中的“ODBC Connect Str”属性中使用全局常量变量(在独立模块中)为了清楚起见,我使用的是GUI,我了解如何在VBA中使用它。如果我不使用变量,它会起作用,下面是连接字符串: ODBC;Driver=SQL Server;Server=pabxsoftdrt;Database=DRT;Trusted_Connection=True; 我试图用常量drtHostname替换服务器值。我尝试过但没有成功的事情(为了便于阅读,我省

我试图在Microsoft Access中的SQL直通查询中的“ODBC Connect Str”属性中使用全局常量变量(在独立模块中)为了清楚起见,我使用的是GUI,我了解如何在VBA中使用它。如果我不使用变量,它会起作用,下面是连接字符串:

ODBC;Driver=SQL Server;Server=pabxsoftdrt;Database=DRT;Trusted_Connection=True;
我试图用常量
drtHostname
替换服务器值。我尝试过但没有成功的事情(为了便于阅读,我省略了可信连接):


我认为您的问题是关于传递查询的
QueryDef.Connect
属性。我认为该属性不可能引用变量

连接字符串可以改用DSN,然后在服务器名称更改时修改DSN。但是您的所有用户都需要在他们的机器上安装DSN

或者,您可以在需要时使用VBA更新
QueryDef.Connect
属性。下面是一个函数的即时窗口示例,该函数更改连接字符串中的服务器部分

strConnect=“ODBC;Driver=sqlserver;Server=pabxsoftdrt;”和_
“数据库=DRT;可信连接=True;”
drtHostname=“新闻服务器”
? ChangeServer(strConnect、drtHostname)
ODBC;驱动程序=SQL Server;服务器=新闻服务器;数据库=DRT;Trusted_Connection=True;
因此,您可以调用函数来更新保存的直通查询的连接字符串

与CurrentDb.querydfs(“您的查询”)
.Connect=ChangeServer(.Connect,drtHostname)
以
使用正则表达式,函数的工作很简单

Public Function ChangeServer(ByVal pConnect作为字符串_
ByVal pServer作为字符串)作为字符串
将re设置为对象“RegExp”
Set re=CreateObject(“VBScript.RegExp”)
re.IgnoreCase=True
re.pattern=“服务器=[^;]*”
ChangeServer=re.Replace(pConnect,“Server=”和pServer)
端函数

或者,您可以将其全部放在SQL中,并在执行之前替换它

    where ptqSQL has
    .. .. ..
    From  
    [ODBC;Driver=SQL Server;Server=@Svr1;Database=@Db1;].dbo.Tbl1 as T1

    Left Join   (Select * From
    [ODBC;Driver=SQL Server;Server=@Svr2;Database=@Db2;].dbo.Tbl2 as T2 
然后在获得sSQL=CurrentDb.querydfs(“ptq_SQL”).SQL之后

进行替换(Svr、Db、Tbl可能已经在ptq_SQL中明确)

然后执行它

    Dim rst As ADODB.Recordset, nRecAffected As Long
    Set rst = yourConnection.Execute(sSQL, nRecAffected)

我还需要在查询中使用参数&如果没有kb131534所示的VBA,这似乎是不可能的。我感觉上述情况也是如此
    sSQL = Replace(sSQL, "@Svr1", "xxx:)
    sSQL = Replace(sSQL, "@Db1", "xxx:)
    sSQL = Replace(sSQL, "@Tbl1", "xxx:)
    sSQL = Replace(sSQL, "@Svr2", "xxx:)
    sSQL = Replace(sSQL, "@Db2", "xxx:)
    sSQL = Replace(sSQL, "@Tbl2", "xxx:)
    Dim rst As ADODB.Recordset, nRecAffected As Long
    Set rst = yourConnection.Execute(sSQL, nRecAffected)