【问题标题】:How to set "Application Name" in ADODB connection string如何在 ADODB 连接字符串中设置“应用程序名称”
【发布时间】:2013-12-22 07:17:21
【问题描述】:

在 .NET 中,我只是在连接字符串中使用 Application Name = MyApp,但是当通过 VBA 使用 ADO 连接时,SQL Server Management Studio 的活动监视器始终在 ProcessesProcesses 中显示 Microsoft Office 2010 Application 列不管我在 VBA 代码上设置了什么名称。

conn.ConnectionString = "UID=" & UID & ";PWD=" & PWD & ";DSN=" & DSN & _
    ";Application Name = MyApp"

如何设置应用程序名称以进行监控?

【问题讨论】:

  • 啊,我看到 VBA 连接字符串不支持他的应用程序名称属性。我能想到解决这个问题的唯一方法是公开你自己的 COM 库并从 VBA 中引用它。您自己的库将通过 .NET 框架连接到数据库,该框架允许您使用 Applcation Name 参数。喜欢使用 COM 库的解决方案让我知道我可以回答我认为@SysDragon
  • 您可以通过VBA轻松设置连接字符串中的应用程序名称,Application Name只是错误的关键字。见my answer

标签: sql-server excel vba connection-string adodb


【解决方案1】:

啊,我看到 VBA 连接字符串不支持 Application Name 属性。在 VBA 中使用时根本无法识别它。目前我能想到解决这个问题的唯一方法是从 COM C# 库返回一个 ADODB.Connection 对象。

您自己的 COM 库将返回一个带有预定义连接字符串的 ADODB.Connection 对象,这似乎在 .NET 中工作。您将使用 VBA ADODB.Connection 对象但使用替换的对象引用连接到数据库。而不是

Set cn = new ADODB.Connection 您将使用您自己的库公开的GetConection() 方法。

Dim cn as ADODB.Connection
Set cn = yourCOMlibrary.GetConnection

这里是步骤

下载安装Visual Studio Express for Windows (FREE)

以管理员身份打开并创建一个新项目。选择 Visual C# 然后选择 Class Library 并将其重命名为 MyConnection

Solution Explorer中,将Class1.cs重命名为ServerConnection.cs

Solution Explorer 中右键单击您的 MyConnection 项目并选择 Add Reference

在搜索框中输入activeX并勾选Microsoft ActiveX Data Objects 6.1 Library

将以下代码复制并粘贴到 ServerConnection.cs 中,完全替换文件中的任何内容。

using System;
using System.Runtime.InteropServices;
using System.IO;
using ADODB;

namespace MyConnection
{
    [InterfaceType(ComInterfaceType.InterfaceIsDual),
    Guid("32A5A235-DA9F-47F0-B02C-9243315F55FD")]
    public interface INetConnection
    {
        Connection GetConnection();
        void Dispose();
    }

    [ClassInterface(ClassInterfaceType.None)]
    [Guid("4E7C6DA2-2606-4100-97BB-AB11D85E54A3")]
    public class ServerConnection : INetConnection, IDisposable
    {
        private Connection cn;

        private string cnStr = "Provider=SQLOLEDB; Data Source=SERVER\\DB; Initial Catalog=default_catalog; User ID=username; Password=password;Application Name=MyNetConnection";

        public Connection GetConnection()
        {
            cn = new Connection();
            cn.ConnectionString = cnStr;
            return cn;
        }

        public void Dispose()
        {
            cn = null;
            GC.Collect();
        }
    }
}

在代码中找到cnStr 变量并更新您的连接字符串详细信息。

注意:如果您不确定应该使用的连接字符串,请参阅ALL CONNECTION STRINGS

单击 Visual Studio 中的工具并创建 GUID

用您自己的 GUID 替换并删除花括号,使它们与您现在从复制的代码中看到的格式相同

解决方案资源管理器中右键单击MyConnection并选择属性。

点击左侧的Application标签,然后点击Assembly Info并勾选Make Assembly COM-Visible

点击左侧菜单中的*Build*并勾选Register For COM Interop

注意:如果您正在开发 64 位 Office,请确保将 Build 菜单上的 Platform Target 更改为 x64!这对于 64 位 Office COM 库是必需的,以避免任何与 ActiveX 相关的错误。


解决方案资源管理器中右键单击MyConnection,然后从菜单中选择Build

如果一切正常,那么您的MyConnection.dllMyConnection.tlb 应该会成功生成。现在就去这条路

C:\Users\username\desktop\

或您保存它们的任何地方

你应该会看到你的文件。


现在打开 Excel 并转到 VBE。点击Tools并选择References

单击浏览按钮并导航到MyConnection.tlb

另外,添加对Microsoft ActiveX Object 6.1 Library 的引用 - 这样您就可以使用 ADODB 库了。

现在右键单击Project Explorer窗口中的任意位置并插入一个新的Module

复制并粘贴下面的代码

Option Explicit

Sub Main()

    Dim myNetConnection As ServerConnection
    Set myNetConnection = New ServerConnection

    Dim cn As ADODB.Connection
    Set cn = myNetConnection.GetConnection

    cn.Open

    Application.Wait (Now + TimeValue("0:00:10"))

    cn.Close
    Set cn = Nothing

    myNetConnection.Dispose

End Sub

打开SQL Server Management Studio,右击服务器,选择Activity Monitor

不要关闭这个窗口


返回 Excel 并点击 F5 或点击功能区上的绿色 播放 按钮。

现在切换回 SSMS (SQL Server Management Studio)

然后等待您的自定义连接名称出现! :)

我们开始吧!那很容易,不是吗? :)


这就是正在发生的事情。

您正在使用 myNetConnection.GetConnection 函数从您的 C# COM 库中返回一个 ADODB Connection 对象

Dim myNetConnection As ServerConnection
Set myNetConnection = New ServerConnection

Dim cn As ADODB.Connection
Set cn = myNetConnection.GetConnection

这几乎就像是在说 Set cn = new ADODB.Connection,但使用了您在 C# 代码中执行的预定义连接字符串。

您现在可以在 VBA 中像使用普通 ADODB.Connection 对象一样使用 cn 对象。

请记住始终.Close() ADODB.Connection。一个好的程序员习惯是始终关闭您打开的任何东西 - 流、连接等。

您可以依靠垃圾收集器来释放引用/内存,但我还为您编写了 Dispose() 方法,以便您可以强制 GC 运行。您可以这样做以立即摆脱连接,这样它就不会在打开的 SSMS 中挂起

记得使用myNetConnection.Disposecn.Close,你会没事的。

注意:

如果有人认为这是错误的或需要更新(因为不稳定或不安全),我会这样做,请发表评论。


嗯,我希望这对以后的任何人都有帮助:)

【讨论】:

  • 感谢@SysDragon。你真的会使用它吗?
  • 我会试试的,因为我在这台计算机上没有管理员权限。
  • "Object library invalid or contains references to object definitions that could not be found" on GetConnection =/
  • 哦,抱歉,具体的太少了。在 Excel 上执行宏时,它会在 Set conn = myNetConn.GetConnection 上引发编译错误
  • @SysDragon 好的。输入 myNetConn. 后你会得到智能感知吗? GetConnectionDispose 是否显示在小下拉列表中?
【解决方案2】:

在 VBA 的 ADODB 连接字符串中设置应用程序名称的正确关键字是 APP,而不是 Application Name

示例连接字符串,从我正在开发的 MS Access 应用程序中复制:

DRIVER={SQL Server};SERVER=xxxx;DATABASE=xxxx;Trusted_Connection=Yes;APP=xxxx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2012-06-14
    • 2013-04-02
    • 2014-09-09
    • 1970-01-01
    • 2017-12-01
    • 2010-09-23
    相关资源
    最近更新 更多