2016-07-18 4 views
0

매우 큰 데이터베이스를 다루는 VB6 레거시 응용 프로그램을 업데이트하려고합니다. 250K 레코드가있는 가능한 업데이트를 위해 레코드 세트를 열어야합니다. SQL Server에 땀을 흘릴 필요가 없습니다. CommandTimeout 속성을 설정하기 만하면됩니다.ADO 레코드 원본으로 명령 - CommandTimeout 무시되었습니다.

이 경우 업데이트 할 수있는 레코드 세트를 반환하지 않으므로 command.Execute 메서드를 사용할 수 없습니다. 따라서 명령 개체를 만들고 속성을 설정 한 다음이를 Recordset.Open 메서드에 제공합니다. 이것은 "Object was Open"오류, 즉 timeout period 이전에 실패합니다. 즉, command.CommandTimeout이 무시되었음을 의미합니다. 연결 문자열은 표준입니다.

    Dim con As New ADODB.Connection 
       '...connection opened (not shown) 
       On Error Resume Next 
       Dim cmd As New ADODB.Command 
       Set cmd = New ADODB.Command 
       cmd.ActiveConnection = con 
       cmd.CommandTimeout = 600 
       cmd.CommandText = "SELECT * FROM BIGTABLE" 

       cmd.CommandType = adCmdText 

       With rsBigTable 
        .CursorType = adOpenKeyset 
        .CursorLocation = adUseClient 
        .LockType = adLockOptimistic 
        .Open cmd 'This give me the error above 

       End With 
       ' Set rsBigTable= cmd.Execute 
       This opens the recordset, but not with parameters I need, such as locktype 
+0

연결이나 닫는 명령입니까? 그 CommandTimeout뿐만 아니라 - 그리고 나는 그것이 30 또는 60 초 기본값으로 생각한다 – dbmitch

+0

그리고 연결뿐만 아니라 설정할 수있는 ConnectionTimeout있다 – dbmitch

답변

0

먼저 클라이언트 측 키 집합 레코드 세트는 없습니다. 클라이언트 쪽 레코드 세트는 항상 고정되어 있으며 사용자의 adUseClient 설정은 adOpenKeyset 설정을 무시하고 (사용자에게 알리지 않고) adStatic으로 설정합니다. 따라서 업데이트 할 수있는 레코드 세트가 없지만 그렇게 할 수도 있습니다. (코드를 디버그 한 후 .CursorLocation = adUseClient을 실행하기 전후에 CursorType 속성을 확인하면 20 년 전 자신이 직접 확인할 수 있습니다.) 확신하기에 앞서 20 년 전의 상황이었습니다.

일괄 업데이트 가능한 클라이언트 쪽 레코드 집합을 사용하려면 LockTypeadLockBatchOptimistic으로 설정하고 변경 내용 게시 방법 (here's Microsoft 문서의 코드 예제)을 조사해야합니다. adLockOptimistic은 레코드 세트를 업데이트 할 수 없으므로 정적 레코드 세트에서 무시됩니다. 그렇지 않으면 ADO의 업데이트 가능한 레코드 집합 만 서버 쪽입니다.

레코드 세트가 이미 열려있는 문제는 미안하지만 CommandTimeout이 무시된다는 결론에 회의적입니다. 이미 여하튼 레코드를 열었을 가능성이 큽니다. 물론, 여기서 볼 수있는 것을 기반으로하고 있으며, 레코드 집합의 수명 내내 코드를 표시하지 않았습니다.

어쨌든 이러한 다른 것들을 정리해야합니다. 그리고 여기에 한 가지 더, :

Dim cmd As New ADODB.Command 
Set cmd = New ADODB.Command 

Dim 문 밖으로 New을 가져 가라. VB6은 .Net처럼 작동하지 않고 실제로는 Dim 행에서 객체를 인스턴스화합니다 (두 번째 행이 중복되는 경우 측점으로 사용함). 대신 객체를 참조 할 때마다 객체의 인스턴스를 확인하고 찾을 수없는 경우 인스턴스를 인스턴스화합니다. 이것은 분명히 불필요한 오버 헤드를 발생시킵니다. 그래서 한 줄에 객체 변수를 선언하고 여기에있는 것처럼 객체 변수를 다른 행에 인스턴스화합니다.

관련 문제