Connection
Excel が 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 をデバッグする方法がわかりません。
参照用に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 c:\Users\administrator\Documents\Visual Studio 2012\Projects\Test\Test\Connection.cs:line 49 の .Connection.Open()