在.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"
如何设置应用程序名称以进行监控?
答案 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
在 Solution Explorer 中,将 Class1.cs
重命名为 ServerConnection.cs
右键单击解决方案资源管理器中的 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中的TOOL并创建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.dll
和MyConnection.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.Dispose
与cn.Close
一起使用,您就可以了。
注意:
如果任何人认为这是错误的或需要更新(如不稳定或不安全),我会这样做,请发表评论。
好吧,我希望这对未来的任何人都有帮助:)
答案 1 :(得分:0)
在VBA中的ADODB连接字符串中设置应用程序名称的正确关键字是APP
,而不是Application Name
。
从我正在处理的MS Access应用程序复制的示例连接字符串:
DRIVER={SQL Server};SERVER=xxxx;DATABASE=xxxx;Trusted_Connection=Yes;APP=xxxx