3

ConnectionExcel が SQL Server に接続できるように、C# でカスタム クラスを作成しています。ライブラリ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

しかし、私は期待し0てい1ました。サーバーに正しく接続していないように思えます(資格情報は同じで、このコードから実際のデータを削除しただけです)

接続文字列のさまざまなバリエーションを使用しようとしましたが、常に と が返さ0れます0。新しい GUID を使用して新しいプロジェクトを作成しようとしましたが、プロジェクトやクラスなどの名前を変更しようとしましたが、何も機能しませんでした。接続の確立を疑っていますが、dll をデバッグする方法がわかりません。

参照用にlink1link2link3link4を使用しました

更新:
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 c:\Users\administrator\Documents\Visual Studio 2012\Projects\Test\Test\Connection.cs:line 49 の .Connection.Open()

4

1 に答える 1

3

接続文字列がありませんProvider=SQLOLEDB

ADODB.Connection は、接続先のデータベースの種類を知る必要があります。

于 2013-07-10T15:10:48.930 に答える