如何在ADODB连接字符串中设置“应用程序名称”

时间:2013-12-05 11:12:42

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

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

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

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

2 个答案:

答案 0 :(得分:16)

啊,我看到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

enter image description here

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

enter image description here

右键单击解决方案资源管理器中的 MyConnection 项目,然后选择 Add Reference

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

enter image description here

将以下代码复制并粘贴到 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中的TOOL并创建GUID

将GUID替换为您自己的删除大括号,使其格式与您从复制的代码中看到的格式相同

enter image description here

右键单击解决方案资源管理器中的 MyConnection ,然后选择“属性”。

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

enter image description here

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

enter image description here

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


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

如果一切正常,则应成功生成MyConnection.dllMyConnection.tlb。现在转到此路径

enter image description here

C:\Users\username\desktop\

或您保存的任何地方

你应该看到你的文件。

enter image description here


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

点击浏览按钮,然后导航至MyConnection.tlb

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

enter image description here

现在右键单击 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

enter image description here

不要关闭此窗口


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

enter image description here

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

并等待自定义连接名称显示! :)

我们走吧!这很容易,不是吗? :)

enter image description here


这就是发生的事情。

您使用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一起使用,您就可以了。

注意:

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


好吧,我希望这对未来的任何人都有帮助:)

答案 1 :(得分:0)

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

从我正在处理的MS Access应用程序复制的示例连接字符串:

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