gpt4 book ai didi

c# - 从 C# dll 使用 ADODB 连接到 SQL 服务器

转载 作者:行者123 更新时间:2023-11-30 16:17:10 28 4
gpt4 key购买 nike

我正在用 C# 为 Excel 编写自定义 Connection 类,以便能够连接到 SQL Server。当我使用 System.Data.SqlClient 库中的 SQLConnection 时,我能够建立连接。我得到的工作代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Runtime.InteropServices;

namespace Test
{

[InterfaceType(ComInterfaceType.InterfaceIsDual),
Guid("6E8B9F68-FB6C-422F-9619-3BA6D5C24E84")]
public interface IConnection
{
bool Status { get; }
bool Open();
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("B280EAA4-CE11-43AD-BACD-723783BB3CF2")]
[ProgId("Test.Connection")]
public class Connection : IConnection
{
private bool status;
private SqlConnection conn;
private string connString = "Data Source=[server]; Initial Catalog=[initial]; User ID=[username]; Password=[password]";

public Connection()
{
}

public bool Status
{
get
{
return status;
}
}

public bool Open()
{
try
{
conn = new SqlConnection(connString);
conn.Open();
status = true;
return true;
}
catch(Exception e)
{
e.ToString();
return false;
}
}
}
}

在添加对 Excel 的引用后,我可以使用如下简单的 VBA 代码测试连接:

Sub TestConnection()

Dim conn As Test.Connection
Set conn = New Test.Connection

Debug.Print conn.Status
conn.Open
Debug.Print conn.Status

End Sub

输出:

False
True

所以一切都很好。现在我想在我的 C# 库中创建自定义 Recordset 类,所以我决定使用 ADODB 库及其 RecordSet 而不是 SqlDataReader 因为我打算处理一些大数据 block 。所以,我修改了我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using System.Runtime.InteropServices;

namespace Test
{

[InterfaceType(ComInterfaceType.InterfaceIsDual),
Guid("6E8B9F68-FB6C-422F-9619-3BA6D5C24E84")]
public interface IConnection
{
bool Status { get; }
bool Open();
}

[ClassInterface(ClassInterfaceType.None)]
[Guid("B280EAA4-CE11-43AD-BACD-723783BB3CF2")]
[ProgId("Test.Connection")]
public class Connection : IConnection
{

private bool status;
private ADODB.Connection conn = new ADODB.Connection();
private string connString = "Data Source=[server]; Initial Catalog=[initial]; User ID=[username]; Password=[password]";

public Connection()
{
}

public bool Status
{
get
{
return status;
}
}

public bool Open()
{
try
{
conn.ConnectionString = connString;
conn.Open();
// conn.Open(connString, ["username"], ["password"], 0)
// what else can I try? is this where it actually fails?
status = true;
return true;
}
catch (Exception e)
{
e.ToString();
return false;
}
}

}
}

我还添加了对 Microsoft ActiveX Data Objects 6.1 Library 的引用。

现在,当我执行 VBA 代码时,它输出:

0
0

但我期待的是 01。在我看来,我没有正确连接到服务器(凭证是相同的,我刚刚从这段代码中删除了实际数据)

我曾尝试使用连接字符串的不同变体,但它始终返回 00。我已经尝试使用新的 GUID 创建一个新项目,还尝试重命名项目、类等。没有任何效果。我怀疑它建立了连接,但我不确定如何调试 dll。

我用过link1 , link2 , link3 , link4供引用

更新:
我已经按照 TheKingDave 的建议将异常写入文件。这是异常错误信息

System.Runtime.InteropServices.COMException (0x80004005): [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified at ADODB._Connection.Open(String ConnectionString, String UserID, String Password, Int32 Options) at TestADODB.Connection.Open() in c:\Users\administrator\Documents\Visual Studio 2012\Projects\Test\Test\Connection.cs:line 49

最佳答案

缺少连接字符串 Provider=SQLOLEDB

ADODB.Connection 需要知道它连接的是什么类型的数据库。

关于c# - 从 C# dll 使用 ADODB 连接到 SQL 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17573544/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com