Невозможно установить ADOX.Catalog.ActiveConnection для ADODB Соединение из.NET

Мне было поручено инкрементное портирование устаревшего приложения VB6 (используя MS Access в качестве базы данных, не спрашивайте) на.NET.

Это будет долго, но я думаю, что лучше дать немного контекста.

Это приложение имеет основную форму MDI с меню, которое создается динамически на основе библиотек DLL, находящихся в папках приложения. По сути, это плагин: каждая DLL представлена ​​элементом меню, который при нажатии открывает главную форму, содержащуюся в DLL, вызывая SetParent() по мере необходимости.

Форма MDI - моя отправная точка. Я хочу переписать достаточно этого (конечно, переделать дизайн и модульное тестирование), чтобы иметь возможность открывать указанные формы. Как только у меня будет этот гвоздь, я начну переписывать по одной DLL за раз.

Каждая DLL нуждается в соединении ADO, которое я смог передать из C#.

Дело в том, что один из этих плагинов (по крайней мере, но, возможно, многие другие) использует ADOX для работы с базой данных, и здесь кроется проблема: когда я пытаюсь установить свойство ActiveConnection ADOX.Catalog для соединения ADO, все Я получаю это ошибка времени выполнения 3001: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

Я не могу на всю жизнь понять, что я делаю неправильно.

Код VB6 настолько прост, насколько это возможно:

Dim c As New ADOX.Catalog
Set c.ActiveConnection = theAdoConnectionComingFromDotNet   ' error!

Код C#, который создает соединение ADO, так же прост, как и код VB:

var conn = new ADODB.Connection();
conn.Open("Provider=Microsoft.JET.Oledb;[...]");

и призыв к Open() преуспевает. Если я попытаюсь установить ActiveConnection на стороне C# примерно так:

var catalog = new ADOX.Catalog();
catalog.ActiveConnection = conn;

все работает.

Теперь я мог бы обойти эту проблему, просто создав экземпляр ADOX на стороне C# и передав его в VB6, но настройка кода VB6 (который, конечно, не имеет ни одного модульного теста) может оказаться PITA, и я не даже уверен, что это будет легко сделать в первую очередь (потому что приложение может использовать несколько БД Access одновременно, открывая и закрывая соединения с каждой из них по мере необходимости).

Итак, кто-нибудь имеет представление о том, что я делаю неправильно? Из C# я пытался ссылаться на ADODB как на вкладке.NET, так и на вкладке COM (и правильная версия ADO, которую я выбрал на вкладке COM: 2.5... опять же, не спрашивайте), но все же нет радость.

РЕДАКТИРОВАТЬ

То же самое происходит, когда я пытаюсь назначить свойство ActiveConnection RecordSet для соединения, которое происходит из C#, например, так:

Dim rs As New ADODB.Recordset
Set rs.ActiveConnection = theAdoConnectionComingFromDotNet

Другой обходной путь, о котором я могу подумать, поскольку ActiveConnection - это Variant, - установить для него свойство ConnectionString соединения. Это работает, но каждый раз будет создавать и открывать новое соединение, и, откровенно говоря, мне это не понравится.

1 ответ

Решение

Это кажется неправильным, но это так подозрительно похоже на проблему, с которой я столкнулся - когда ADO перестал работать в COM-объекте, перекомпилированном на машине с Win7, а затем на машине с XP - что я думаю, что это может быть связано с тем же, А именно, катастрофическое обновление Windows, которое сломало MDAC ADO в COM-объектах (очень длинный поток, ожидайте медленную загрузку). Если это так, официальное исправление можно найти здесь.

Если это не так, и вы не можете найти решение, я думаю, что вам лучше всего использовать обходной путь строки подключения, который вы упомянули при редактировании. Это не идеально, но вы говорите, что все равно начнете переписывать библиотеки DLL, так что это будет только временное соглашение.

Другие вопросы по тегам