从C#dll使用ADODB连接到SQL server

从C#dll使用ADODB连接到SQL server,c#,sql-server,vba,ado.net,ado,C#,Sql Server,Vba,Ado.net,Ado,我正在用C#编写一个自定义的连接类,以便Excel能够连接到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; u

我正在用C#编写一个自定义的
连接
类,以便Excel能够连接到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
它输出:


正确

所以一切都很好。现在我想在我的C#库中创建自定义的
记录集
类,所以我决定使用
ADODB
库及其
记录集
,而不是
SqlDataReader
,因为我计划处理一些大数据块。因此,我将代码修改为:

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库的引用

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

0
0

但是我期望
0
1
。在我看来,我似乎没有正确连接到服务器(凭据与我刚刚从代码中删除的实际数据相同)。

我尝试使用连接字符串的不同变体,但是它总是返回
0
0
。我尝试过用新的guid创建一个新项目,还尝试过重命名项目、类等,但没有任何效果。我怀疑这是建立连接的原因,但我不确定如何调试dll

我使用、、作为参考

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

System.Runtime.InteropServices.COMException(0x80004005): [Microsoft][ODBC驱动程序管理器]未找到数据源名称,并且没有 在ADODB上指定的默认驱动程序。\u Connection.Open(字符串 连接字符串、字符串用户ID、字符串密码、Int32选项)位于 c:\Users\administrator\Documents\Visual中的testadob.Connection.Open() Studio 2012\Projects\Test\Test\Connection.cs:第49行


连接字符串缺少
Provider=SQLOLEDB


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

将您的异常打印到文件或其他文件中,以便查看所显示的内容。我假设Open()抛出了一个异常。“因此,我决定使用ADODB库及其记录集,而不是SqlDataReader,因为我计划处理一些大数据块”-不知道如何从A到B。。。为什么?您说您有一些使用
SqlClient
的工作代码,但您想使用ADODB。。。为什么?如果您还添加了Provider=SQLOLEDB呢?很高兴这是一个简单的解决方案@事实上,我会说它更有效,因为它是一个读者;这仍然是一个单一的流-它不是每行或任何东西的往返。使用读卡器,您可以a:在第一行可用时开始使用数据(而不是等待所有数据),b:避免将所有数据保存在内存中。如果您想要断开连接的chunk-o-data,请将其放入
DataTable
或(更好,IMO)POCO模型中。谢谢@BradRem,发现得很好!