2012-05-15 1 views
4

.NET에 데이터베이스로 MS Access를 사용하는 기존 VB6 앱을 점진적으로 포팅해야한다는 과제가있었습니다.ADOX.Catalog.ActiveConnection을 ADODB에 설정할 수 없습니다. .NET에서 오는 연결

이것은 길어 보일 것입니다. 그러나 약간의 문맥을 제공하는 것이 더 좋습니다.

이 응용 프로그램은 응용 프로그램의 폴더에있는 DLL을 기반으로 동적으로 생성되는 메뉴가있는 기본 MDI 양식을 가지고 있습니다. 그것은 기본적으로 플러그인 종류의 것입니다 : 각 DLL은 클릭 할 때, DLL에 포함 된 메인 폼을 열고 필요한 경우 SetParent()을 호출하는 메뉴 항목으로 나타납니다.

MDI 형식이 나의 출발점입니다. 나는 그 양식들을 열 수있을만큼 충분히 재 작성하고 싶다. (다시 설계하고 단위 테스트를한다.) 일단 그 파일을 가져 오면 한 번에 하나의 DLL을 다시 작성하기 시작합니다.

모든 DLL에는 C#에서 전달할 수있는 ADO 연결이 필요합니다.

문제는 그 플러그 - 인 중 하나 (적어도,하지만 아마도 다른 많은 것들)는 ADOX를 사용하여 데이터베이스에서 작업을 수행하며 여기에 문제가 있습니다. ADOX.Catalog의 ActiveConnection 속성을 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! 

ADO 연결을 작성하는 C# 코드는 VB 한만큼 간단하다 :

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 DB를 사용할 수 있기 때문에 필요에 따라 각각의 연결을 열고 닫을 수 있기 때문이다.)

그래서 아무도 내가 잘못하고있는 것에 대해 알지 못합니까? C#에서 나는 .NET 탭과 COM 하나 (그리고 COM 탭에서 선택한 ADO 버전 중 하나임 : 2.5 ..., 묻지 않음)에서 ADODB를 참조하려고 시도했지만 여전히 그렇지 않습니다. 즐거움.

편집

내가 지금처럼, C 번호에서 오는 연결에 레코드 집합의 ActiveConnection 속성을 할당 할 때 정확한 같은 일이 발생합니다

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

내가 생각할 수있는 또 다른 해결 방법 ActiveConnection은 Variant이므로 연결의 ConnectionString 속성을 설정해야합니다. 그게 효과가 있지만, 매번 새로운 연결을 만들고 열어 줄 것이고 솔직히 나는 그것을 좋아하지 않을 것입니다.

답변

1

잘못된 방법으로 보입니다.하지만 이것은 내가 의심했던 것과 매우 유사합니다. ADO는 XP 개체에서 Win7 컴퓨터에서 다시 컴파일 한 COM 개체에서 작업을 중단 한 것입니다. 같은 일로. 즉, 비참한 Windows 업데이 트 broke MDAC ADO in COM objects (매우 긴 스레드, 천천히 로딩을 기대). 그렇다면 공식적인 수정은 found here 일 수 있습니다.

그게 아니라면 해결책을 찾을 수 없지만 최선의 행동 방침은 편집에서 언급 한 연결 문자열 해결 방법을 사용하는 것입니다. 이상적은 아니지만 어쨌든 DLL을 다시 작성하기 시작할 것이므로 임시 계약 일뿐입니다.

+0

어, 나는 그 심각한 SP1에 대해 알고 있습니다;) 사실, 나는 픽스를 설치했습니다. 그래서 나는 그것을 배제 할 수 있다고 생각합니다. 또한 Win7 인 자체의 dev 컴퓨터에서 VB6 DLL을 컴파일하고 있습니다. 나는 연결 문자열을 사용하거나 C#의'Catalog'를 전달할 것이라고 생각합니다. 첫 번째 경로를 선택할 때 데이터베이스 연결이 누출 될까봐 걱정했지만 ActiveConnection을 수동으로 닫을 수 있습니다. 감사합니다, Antagony. 나는 누군가가 가지고 있고 동일한 문제를 해결 한 경우에, 받아들이 기 전에 더 며칠을 기다릴 것이다. –

+0

@ s.m. 그건 이상한데, 다른 날에 내가 여기에 메시지를 남겼다고 맹세 할 수 있었어! 오 글쎄, 내가 여기에 올린 줄 알았던 것의 요지가 여기에있다. 내가 생각할 수있는 유일한 다른 것 - 아마도 나는 계란을 빨아 먹을 나의 할머니를 가르치고있을지라도 =) - 아마도 .NET과 VB6 구성 요소 일 것이다. 잘못된 ADO 라이브러리를 참조하고 있습니다. .NET 2005에서는 PIA가 MDAC 2.8을 지원하지 않았기 때문에 MDAC 2.7을 사용할 ** 것을 알았습니다. VB6 이후로 변경 될 가능성은 희박합니다. – Antagony

+0

감사합니다. 올바른 버전을 사용하고 있다고 확신하지만 몇 가지 검사를 더 실시 할 것입니다. 하지만, 작동하지 않을지라도, 나는 연결 문자열 아이디어를 구현할 것이고, 그것은 나에게 위험한 것처럼 보일 수 없다. –