【问题标题】:Connecting to a SQL server using ADODB from a C# dll从 C# dll 使用 ADODB 连接到 SQL 服务器
【发布时间】:2013-07-08 13:18:02
【问题描述】:

我正在 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

它输出:

错误
真的

所以一切都很好。现在我想在我的 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 Driver Manager] 数据源名称未找到且无 ADODB._Connection.Open(String) 中指定的默认驱动程序 ConnectionString、String UserID、String Password、Int32 选项)在 c:\Users\administrator\Documents\Visual 中的 TestADODB.Connection.Open() Studio 2012\Projects\Test\Test\Connection.cs:第 49 行

【问题讨论】:

  • 将您的异常打印到文件或其他文件中,以便您查看内容。我假设 Open() 正在引发异常。
  • “所以我决定使用 ADODB 库及其 RecordSet 而不是 SqlDataReader,因为我打算处理一些大数据块” - 不知道你是如何从 A 到 B 的; ... 为什么?你说你有一些使用SqlClient 的工作代码,但你想使用 ADODB……这是为什么呢?
  • 如果还添加 Provider=SQLOLEDB 会怎样?
  • 很高兴这很容易解决!
  • @mehow 实际上,我会说它是 more 因为是一个阅读器;这仍然是一个单一的流 - 它不是每行或任何东西的往返。使用阅读器可以让您:在 first 行可用时开始使用数据(而不是必须等待所有数据),并且 b:避免必须将所有数据保存在内存中。如果您想要断开连接的数据块,请将其放入 DataTable 或(更好,IMO)放入 POCO 模型中。

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


【解决方案1】:

连接字符串丢失Provider=SQLOLEDB

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

【讨论】:

  • 谢谢@BradRem,很好发现!
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 2019-03-21
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多