啊,我看到 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.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,你会没事的。
注意:
如果有人认为这是错误的或需要更新(因为不稳定或不安全),我会这样做,请发表评论。
嗯,我希望这对以后的任何人都有帮助:)