Sys*_*gon 7 sql-server excel vba connection-string adodb
在.NET中我只是使用Application Name = MyApp的连接字符串中,但是使用通过VBA ADO连接时,SQL Server Management Studio中的活动监视器始终显示Microsoft Office 2010在Processes该Application列不管我在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.cs为ServerConnection.cs

MyConnection在Solution 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 Target将Build菜单更改为x64!这对于64位Office COM库是必需的,以避免任何与ActiveX相关的错误.
右击MyConnection在解决方案资源管理器,然后选择Build从菜单.
如果一切OK,然后你MyConnection.dll和MyConnection.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,你会没事的.
注意:
如果任何人认为这是错误的或需要更新(如不稳定或不安全),我会这样做,请发表评论.
好吧,我希望这对未来的任何人都有帮助:)