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

Sys*_*gon 7 sql-server excel vba connection-string adodb

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

conn.ConnectionString = "UID=" & UID & ";PWD=" & PWD & ";DSN=" & DSN & _
    ";Application Name = MyApp"
Run Code Online (Sandbox Code Playgroud)

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

小智 16

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

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

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

Dim cn as ADODB.Connection
Set cn = yourCOMlibrary.GetConnection
Run Code Online (Sandbox Code Playgroud)

这是步骤

下载并安装适用于Windows的Visual Studio Express(免费)

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

在此输入图像描述

解决方案资源管理器中,重命名Class1.csServerConnection.cs

在此输入图像描述

MyConnectionSolution Explorer中右键单击您的项目,然后选择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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

单击Visual Studio中的工具和CREATE GUID

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

在此输入图像描述

右击MyConnection解决方案资源管理器,然后选择属性.

单击Application左侧的选项卡,然后Assembly Info勾选Make Assembly COM-Visible

在此输入图像描述

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

在此输入图像描述

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


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

如果一切OK,然后你MyConnection.dllMyConnection.tlb应成功生成.现在就去这条路

在此输入图像描述

C:\Users\username\desktop\
Run Code Online (Sandbox Code Playgroud)

或者保存它们的地方

你应该看到你的文件.

在此输入图像描述


现在打开Excel并转到VBE.单击Tools并选择References.

单击Browse按钮并导航到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
Run Code Online (Sandbox Code Playgroud)

打开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
Run Code Online (Sandbox Code Playgroud)

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

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

记住要始终.Close()使用ADODB.Connection.一个优秀的程序员实践是始终关闭你打开的任何东西 - 流,连接等.

您可以依赖垃圾收集器来释放引用/内存,但我也Dispose()为您编写了一个方法,以便您可以强制GC运行.你可以这样做,立即摆脱连接,因此它不会在SSMS中打开.

记得和你myNetConnection.Dispose一起使用cn.Close,你会没事的.

注意:

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


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