2012-09-13 2 views
1

Visual Basic 프론트 엔드로 데이터를 가져 오는 SQL OleDbDataReader가 있습니다. 독자가 보유하고있는 레코드 수를 찾을 수 있습니까? 이 값을 사용하여 루프를 끝내기를 원합니다.SQL OleDbDataReader의 길이 찾기

아래 코드는 제 코드입니다. 이 부분은 계산을 실행하고 값을 다시 액세스에 삽입 할 데이터를 찾는 것입니다. 한 번에 계산을 위해 모든 데이터 포인트를 계산할 때 코드가 너무 오래 걸리고 있음을 알리는 시간 초과 오류가 있었기 때문에 현재 일괄 처리 방법을 사용하고 있습니다. 아래의 코드는 첫 번째 일괄 처리에 대해서는 작동하지만 두 번째 단계에서는 실패합니다. 이는 리더 내의 다음 데이터 섹션을 볼 수 없기 때문입니다. 데이터가 미래에 올바른 순서로 표시되지 않을 수 있으므로 모든 리더를 한 번에 보는 것이 가장 좋습니다. 이 문제를 해결하려면 Do Until SearchCounter =the length of the reader해야합니다. 나는 길이를 찾기 위해 배열의 내용을 넣으려고했으나 시간이 많이 걸렸다. 다른 제안은 매우 환영받을 것입니다.

For CalcParameterCounter = 0 To CalcParams.GetLength(0) - 1 

       ParamQuery = "ID_PAR = " & Format(CalcParams(CalcParameterCounter), "0") 
       conditions = ParamQuery ' & UploadQuery 

       DatabaseConnection("SELECT " & FieldNames & " FROM " & tablename & " WHERE " & conditions, "Read Recordset" 

       CalcDataRecordPointer = 0 
       Do Until rdrOLEDB.Read = False 
        SearchCounter = 0 
        Do Until SearchCounter = CalcData.GetLength(1) 
         CalcDataRecordPointer = CalcDataRecordPointer + 1 
         If CalcDataRecordPointer = CalcData.GetLength(1) Then CalcDataRecordPointer = 0 
         Value = rdrOLEDB.Item(1) 
         If CDate(rdrOLEDB.Item(0).ToString()) = CDate(CalcData(0, CalcDataRecordPointer)) Then 
          match = True 
          CalcData(CalcParameterCounter + 1, CalcDataRecordPointer) = rdrOLEDB.Item(1).ToString() 
          Exit Do 
         Else 
          match = False 
         End If 
         SearchCounter = SearchCounter + 1 
        Loop 
       Loop 
       'Close: 
       rdrOLEDB.Close() 
       cnnOLEDB.Close() 
      Next 
+2

SQL Server는 일반적으로 읽지 않을 때까지 마지막 행의 내용을 알지 못합니다. 로우 카운트를 아는 것이 중요하다면, 쿼리에'count()'를 추가 할 수 있습니다. 새 쿼리가 미리 전송되거나 실제 쿼리의 일부로 전송됩니다. 이것은 성능 비용과 함께 제공됩니다. – Andomar

답변

0

reader.Read()를 사용하는 것은 레코드 세트를 반복하는 문서화 된 방법입니다. VBA와 ADO에서 프로그래밍을했는데, 다른 커서 유형을 사용하면 반복하기 전에 총 레코드 수를 알 수 있습니다. 이는 성능 히트를 생성합니다. 즉, Excel을 사용하고 있기 때문에 명령 객체가 레코드 세트를 메모리에 놓아야 만 리더가 시작됩니다.

OleDb는 완벽하게 수용 가능한 데이터 라이브러리이지만 ADO에서 SQL 2000 -> 2008 R2와 호환되는 동일한 작업 (MDAC2.8 현재)을 수행 할 수 있습니다. 이 문제를 보는 또 다른 방법은 SQL 저장 프로 시저에서 처리를 수행 한 다음 코드로 출력 할 수 있는지 확인하는 것입니다.

행운을 비네.

+0

답장을 보내 주셔서 감사합니다. 다른 곳에서는 코드를 변경하여 문제를 해결할 수있었습니다. 결국 ADO 데이터 라이브러리로 변경할 계획이지만 현재는 관리를 행복하게 유지하기 위해 무언가를 실행하는 것이 더 중요합니다 ... – Pezzzz