Avatar billede jogii Nybegynder
07. maj 2008 - 09:24 Der er 5 kommentarer og
1 løsning

ODBC adgang henter ikke alle data ved at loope gennem records

Jeg programmerer fra LotusScript (IBM Lotus Notes og Domino) op imod et medlemsregister placeret på en Oracle10 server.
Der er ca. 8000 poster med 30 kolonner.

Problemet er at loopen stopper efter ca. 3000 poster, når jeg laver en SELECT *
Når jeg udpeger nogle på kolonner, så kører den igennem alle records.

Er det almindelig opførsel? Kan der justeres på det? Er der en buffer involveret?
Avatar billede arne_v Ekspert
07. maj 2008 - 15:12 #1
Er du sikker paa at det ikke er en  kode/app fejl ?
Avatar billede jogii Nybegynder
07. maj 2008 - 15:42 #2
Nej, det kan jeg ikke være sikker på. Men det lader til at være afhængig af mængden af kolonner jeg SELECT'er. Som sagt er det 30 kolonner. Hvis jeg kun vælger 3 kolonner i SELECT, så looper den fint.


Koden er her

    Dim connection As New ODBCConnection
    Dim query As New ODBCQuery
    Dim result As New ODBCResultSet
   
    Dim count As Long
    Dim i As Integer
   
    If Not connection.ConnectTo("OracleXE", "hr", "hr") Then
        Print "No connection to Oracle"
        Print connection.GetErrorMessage
        Print connection.GetExtendedErrorMessage
        Exit Sub
    End If
   
    Set query.Connection = connection

    query.SQL =  "SELECT TABEL.MEDLEMSNUMMER, TABEL.FORNAVN, TABEL.MELLEMNAVN, TABEL.ETTERNAVN FROM HR.TABEL TABEL"
    'query.SQL =  "SELECT * FROM HR.TABEL TABEL"
    Set result.Query = query
    If Not result.Execute Then
        Print "SQL SELECT statement did not return any results"
        Print query.GetErrorMessage
        Print query.GetExtendedErrorMessage
        Goto close_sql   
    End If
   
    Do
        If Not result.NextRow Then Goto nextRow_Error
        If count Mod 1000 = 0 Then
            Print "Count = " + Cstr(count) + ", Col(1) = " + Cstr(result.GetValue(1))
        End If       
        count = count + 1
    Loop Until result.IsEndOfData
    For i = 1 To 9
        Print "Last line: Col(" + Cstr(i) + ") = " + Cstr(result.GetValue(i))
    Next
   
close_sql:
    result.Close(DB_CLOSE)
    connection.Disconnect
    Print Cstr(count) + " rows handled"
    Exit Sub
   
nextRow_error:
    Print "NextRow failed"
    Print result.GetErrorMessage
    Print result.GetExtendedErrorMessage
    Goto close_sql
Avatar billede kjulius Novice
07. maj 2008 - 23:05 #3
Prøv at sætte .MaxRows property til et større tal inden du går ind i loopet og se om det ikke hjælper:

result.MaxRows = 25000

Eller måske .CacheLimit property?

result.CacheLimit = 100
Avatar billede jogii Nybegynder
07. maj 2008 - 23:22 #4
Hallo !!! CacheLimit, det var lige sagen.
Smid et svar
Avatar billede kjulius Novice
07. maj 2008 - 23:38 #5
Kommer her... :-)

Jeg ved ikke om det er relevant, men IBM har på deres store site en liste over rettelser til Lotus Notes og Lotus Domino Release 6.0.3, som bl.a. indeholder følgende rettelse:

DMAE5FSKDB SPR# DMAE5FSKDB - When ODBCResultSet CacheLimit and FetchBatchSize values are equal, looping through the result set using both NextRow and IsEndOfData methods no longer skips any data rows.

Det ligner lidt dit problem, synes jeg.

Anyway, bare du fik løst dit problem her og nu er nok ikke grund til at grave mere "snavs" frem. :-)
Avatar billede jogii Nybegynder
08. maj 2008 - 00:01 #6
Ja, det er da heldig at 6.0.3 kun er 5 år gammel :-)
Nu er vi nået til 8.0.1.

Og i mellemtiden er jeg kommet i tanke om at jeg har prøvet dette før, for 8 år siden, dengang også med Oracle og ODBC. Men tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester