使用来自C#dll的ADODB连接到SQL服务器

时间:2013-07-10 14:37:18

标签: c# sql-server vba ado.net ado

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

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#库中创建自定义Recordset类,因此我决定使用ADODB库及其RecordSet而不是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 Library的引用。

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

  

0
  0

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

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

我使用link1link2link3link4作为参考

更新
我已经像TheKingDave建议的那样在文件中写了例外。这是异常错误消息

  

System.Runtime.InteropServices.COMException(0x80004005):   [Microsoft] [ODBC驱动程序管理器]未找到数据源名称,没有   在ADODB._Connection.Open(String   ConnectionString,String UserID,String Password,Int32 Options)at   C:\ Users \ administrator \ Documents \ Visual中的TestADODB.Connection.Open()   Studio 2012 \ Projects \ Test \ Test \ Connection.cs:第49行

1 个答案:

答案 0 :(得分:3)

缺少连接字符串Provider=SQLOLEDB

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