这将是一个漫长的过程,但我认为最好给出一些背景信息.
这个应用程序有一个主MDI表单,其中包含一个菜单,该菜单是根据应用程序文件夹中的DLL动态创建的.它基本上是一个插件类型的东西:每个DLL都由一个菜单项表示,当单击它时,将打开DLL中包含的主窗体,根据需要调用SetParent().
MDI表格是我的出发点.我想重写它(当然我重新设计和单元测试),以便能够打开所述表格.一旦我将那个钉入,我将开始一次重写一个DLL.
每个DLL都需要一个ADO连接,我已经能够从C#传递.
问题是,其中一个插件(至少,但可能还有许多其他插件)使用ADOX在数据库上执行操作,这就存在问题:当我尝试将ADOX.Catalog的ActiveConnection属性设置为ADO连接时,所有我得到的是运行时错误3001:参数类型错误,超出可接受的范围,或者彼此冲突.
我不能为我的生活弄清楚我做错了什么.
VB6代码尽可能简单:
Dim c As New ADOX.Catalog Set c.ActiveConnection = theAdoConnectionComingFromDotNet ' error!
var conn = new ADODB.Connection(); conn.Open("Provider=Microsoft.JET.Oledb;[...]");
并且对open()的调用成功.
如果我尝试在C#端设置ActiveConnection,如下所示:
var catalog = new ADOX.Catalog(); catalog.ActiveConnection = conn;
一切正常.
现在,我可以通过简单地在C#端实例化ADOX并将其传递给VB6来解决这个问题,但调整VB6代码(当然没有单个单元测试)可以证明是PITA,我不是甚至可以确保首先容易做到(因为应用程序可以同时使用多个Access数据库,根据需要打开和关闭每个数据库的连接).
所以,任何人都知道我做错了什么?从C#开始,我尝试从.NET选项卡和COM选项卡中引用ADODB(我从COM选项卡中选择的ADO版本是正确的:2.5 ……再次,不要问),但仍然没有喜悦.
编辑
当我尝试将RecordSet的ActiveConnection属性分配给来自C#的连接时,会发生完全相同的事情,如下所示:
Dim rs As New ADODB.Recordset Set rs.ActiveConnection = theAdoConnectionComingFromDotNet
我能想到的另一种解决方法,因为ActiveConnection是一个Variant,它将把它设置为连接的ConnectionString属性.这是有效的,但它每次都会创建并打开一个新的连接,坦白说我不喜欢它.
解决方法
如果不是这样,并且您找不到解决方案,我认为您最好的做法是使用您在编辑中提到的连接字符串解决方法.它并不理想,但你说你无论如何都会开始重写DLL,所以它只是一个临时的安排.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。