我正在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
但我期待0
和1
。在我看来,我没有正确连接到服务器(凭据我刚刚从此代码中删除了实际数据)。
我尝试使用连接字符串的不同变体,但它始终返回0
和0
。我尝试使用新的GUID创建一个新项目,并尝试重命名项目,类等。没有任何工作。我怀疑它建立了连接,但我不确定如何调试DLL。
我使用link1,link2,link3,link4作为参考
更新
我已经像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行
答案 0 :(得分:3)
缺少连接字符串Provider=SQLOLEDB
。
ADODB.Connection需要知道它连接的数据库类型。