这就是我安全存储连接字符串凭据的方法
下载安装Visual Studio Express 2012 for Windows (FREE)
以管理员身份打开并创建一个新项目。选择 Visual C# 然后选择 Class Library 并将其重命名为 HiddenConnectionString
在Solution Explorer中,将Class1.cs重命名为MyServer.cs
在 Solution Explorer 中右键单击您的 MyConnection 项目并选择 Add Reference
在搜索框中输入activeX并勾选Microsoft ActiveX Data Objects 6.1 Library
将以下代码复制并粘贴到 MyServer.cs 中,完全替换文件中的任何内容。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
using System.IO;
using ADODB;
namespace HiddenConnectionString
{
[InterfaceType(ComInterfaceType.InterfaceIsDual),
Guid("2FCEF713-CD2E-4ACB-A9CE-E57E7F51E72E")]
public interface IMyServer
{
Connection GetConnection();
void Shutdown();
}
[ClassInterface(ClassInterfaceType.None)]
[Guid("57BBEC44-C6E6-4E14-989A-B6DB7CF6FBEB")]
public class MyServer : IMyServer
{
private Connection cn;
private string cnStr = "Provider=SQLOLEDB; Data Source=SERVER\\INSTANCE; Initial Catalog=default_catalog; User ID=your_username; Password=your_password";
public MyServer()
{
}
public Connection GetConnection()
{
cn = new Connection();
cn.ConnectionString = cnStr;
cn.Open();
return cn;
}
public void Shutdown()
{
cn.Close();
}
}
}
在代码中找到cnStr 变量并更新您的连接字符串详细信息。
在解决方案资源管理器中右键单击*HiddenConnectionString* 解决方案并选择属性。
点击左侧的Application标签,然后点击Assembly Info并勾选Make Assembly COM-Visible
点击左侧菜单中的*Build*并勾选Register For COM Interop
注意:如果您正在开发 64 位 Office,请确保将 Build 菜单上的 Platform Target 更改为 x64!这对于 64 位 Office COM 库是必需的,以避免任何与 ActiveX 相关的错误。
在解决方案资源管理器中右键单击HiddenConnectionString,然后从菜单中选择Build。
如果一切顺利,那么您的HiddenConnectionString.dll 和HiddenConnectionString.tlb 应该会成功生成。现在就去这条路
C:\Users\administrator\Documents\Visual Studio 2012\Projects\HiddenConnectionString\HiddenConnectionString\bin\Debug
你应该会看到你的文件。
现在打开 Excel 并转到 VBE。点击Tools并选择References。
单击浏览按钮并导航到HiddenConnectionString.tlb。
另外,添加对Microsoft ActiveX Object 6.1 Library 的引用 - 这样您就可以使用 ADODB 库了。
现在右键单击Project Explorer窗口中的任意位置并插入一个新的Module
复制并粘贴下面的代码
Option Explicit
Sub Main()
Dim myCn As MyServer
Set myCn = New MyServer
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open "Select * from [TABLE_NAME]", myCn.GetConnection
Range("A1").CopyFromRecordset rs
rs.Close
myCn.Shutdown
Set rs = Nothing
Set myCn = Nothing
Columns.AutoFit
End Sub
将[TABLE_NAME] 替换为数据库中的实际表名。
点击 F5 或点击功能区上的绿色 播放 按钮。
如果一切正常,您现在应该会在电子表格中看到返回的表格。
我的样本:
如您所见。添加对您自己的 COM 库的引用并将登录凭据和其他敏感数据存储在已编译的 .dll 中可以保护您的数据(连接字符串)。反编译*.dll 文件以从中获取任何有意义的信息非常困难。有多种编码技术可以进一步保护您的*.dll,但我现在不打算详细介绍。这本身就达到了您的要求。
myCn.GetConnection 返回在引用的 COM 库中初始化的 ADODB.Connection 对象。不会向 Excel 用户显示连接字符串或敏感数据(实际上其他人也不会)。
您可以修改 C# 代码以接受来自 VBA 的参数,即登录名、密码、初始目录、要执行的查询等...如果您的 SQL Server 实例上的用户具有不同的权限,那也不错允许人们登录的想法。
注意:C# 代码和 VBA 中没有添加错误处理。如果您打算使用我上面描述的技术,我强烈建议您使用它。