I am working on Pervasive SQL 2000i SP4 and accessing my data via the Btrieve API. Recently I delved into the GetNextExtended operation and using the 'EG' option, but the first record in was always ignored. To take the first record into account as well I decided to switch to the 'UC' option, but this resulted in the same record being returned repeatedly. The databuffer I generate contain no 'Terms'.
Any help would be greatly appreciated.
'Form1 - just a form with one button on it
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
(Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command_Click()
GetAllRecords
End Sub
Private Sub GetAllRecords()
Dim boolContinueLoop As Boolean
Dim objBtrvAPI As clsBtrvAPI
Set objBtrvAPI = New clsBtrvAPI
objBtrvAPI.OpenConnection "C:\Pastel09\_Demo\accrecpt.dat"
objBtrvAPI.GetFirst
boolContinueLoop = True
Do
objBtrvAPI.Record = GenerateGetNextExtendedDataBuffer()
objBtrvAPI.GetNextExtended
If (Not objBtrvAPI.EOF) Then
'Read record - not necessary for this test
End If
boolContinueLoop = (Not objBtrvAPI.EOF)
Loop Until Not boolContinueLoop
objBtrvAPI.CloseConnection
Set objBtrvAPI = Nothing
End Sub
Private Function GenerateGetNextExtendedDataBuffer() As Byte()
Dim intRecordImageLength As Integer
Dim bytDataBuffer() As Byte
Dim intDataBufferElementCount As Integer
Dim intNoOfLeadingBytesReturnedByExtendedOp As Integer
intRecordImageLength = 94
ReDim bytDataBuffer(0)
AddIntToByteArray bytDataBuffer, intDataBufferElementCount, 0 'Total data buffer size - placeholder, value will be assigned later
AddStringToByteArray bytDataBuffer, intDataBufferElementCount, "UC" 'Begin with the current record
AddIntToByteArray bytDataBuffer, intDataBufferElementCount, 0 'Max Reject Count
AddIntToByteArray bytDataBuffer, intDataBufferElementCount, 0 'Number Of Terms
AddIntToByteArray bytDataBuffer, intDataBufferElementCount, 1 'Number of records to retrieve
AddIntToByteArray bytDataBuffer, intDataBufferElementCount, 1 'Number of fields to extract
AddIntToByteArray bytDataBuffer, intDataBufferElementCount, intRecordImageLength 'Field length - select the entire record in one field
AddIntToByteArray bytDataBuffer, intDataBufferElementCount, 0 'Field offset/position
'Eight bytes are returned on the GetNextExtended call
'2 bytes - number of records returned - at present only one record is returned at one time
'2 bytes - length of the record image
'4 bytes - a pointer to the record
intNoOfLeadingBytesReturnedByExtendedOp = 8
SetLeadingBytesToIndicateSize bytDataBuffer, intDataBufferElementCount
If (intDataBufferElementCount < intRecordImageLength + intNoOfLeadingBytesReturnedByExtendedOp) Then
MakeSize bytDataBuffer, intDataBufferElementCount, intRecordImageLength + intNoOfLeadingBytesReturnedByExtendedOp
End If
GenerateGetNextExtendedDataBuffer = bytDataBuffer
End Function
Public Sub AddIntToByteArray(ByRef pbytDataBuffer() As Byte, _
ByRef pintElementCount As Integer, _
ByVal pintValue As Integer)
Dim i As Integer
Dim byteValue() As Byte
byteValue = ConvertIntToByteArray(pintValue)
pintElementCount = pintElementCount + 2
ReDim Preserve pbytDataBuffer(pintElementCount - 1)
For i = 1 To 0 Step -1
pbytDataBuffer(pintElementCount - 1 - i) = byteValue(1 - i)
Next i
End Sub
Public Sub AddStringToByteArray(ByRef pbytDataBuffer() As Byte, _
ByRef pintElementCount As Integer, _
ByVal pstrValue As String)
Dim i As Integer
Dim strValueToConvert As String
Dim byteValue() As Byte
pintElementCount = pintElementCount + Len(pstrValue)
ReDim Preserve pbytDataBuffer(pintElementCount - 1)
strValueToConvert = StrReverse(pstrValue)
For i = Len(pstrValue) To 1 Step -1
pbytDataBuffer(pintElementCount - i) = Asc(Mid$(strValueToConvert, i, 1))
Next i
End Sub
Private Sub MakeSize(ByRef pbytDataBuffer() As Byte, _
ByRef pintElementCount As Integer, _
ByVal pintSize As Integer)
pintElementCount = pintSize
ReDim Preserve pbytDataBuffer(pintElementCount - 1)
End Sub
Private Sub SetLeadingBytesToIndicateSize(ByRef pbytDataBuffer() As Byte, _
ByRef pintElementCount As Integer)
Dim i As Integer
Dim byteSize() As Byte
byteSize = ConvertIntToByteArray(pintElementCount)
For i = 0 To UBound(byteSize)
pbytDataBuffer(i) = byteSize(i)
Next i
End Sub
Private Function ConvertIntToByteArray(ByVal pintValue As Integer) As Byte()
Dim byteArray(0 To 1) As Byte
CopyMemory byteArray(0), ByVal VarPtr(pintValue), Len(pintValue)
ConvertIntToByteArray = byteArray
End Function
'clsBtrvAPI
Option Explicit
Private Const KEY_BUFFER_LEN = 255
'Btrieve operations
Private Const B_OPEN = 0
Private Const B_CLOSE = 1
Private Const B_GETFIRST = 12
Private Const B_STAT = 15
Private Const B_GETNEXTEXTENDED = 36
Private Declare Function BTRCALL Lib "wbtrv32.dll" (ByVal OpCode As Integer, PositionBlock As Any, DataBuffer As Any, _
DataLength As Long, KeyBuffer As Any, ByVal KeyLength As Integer, _
ByVal KeyNumber As Integer) As Integer
Private Type TypePositionBlock
PosBlk(128) As Byte
End Type
Private Type TypeOwner
Owner As String * 8
End Type
Private Type TypeKeySpec
KeyPos As Integer
KeyLen As Integer
KeyFlags As Integer
KeyTot As String * 4
KeyType As String * 1
Reserved As String * 5
End Type
Private Type TypeStatFileSpecs
RecLen As Integer
PageSize As Integer
IndexTot As Integer
RecTot As String * 4
FileFlags As Integer
Reserved As String * 2
UnusedPages As Integer
KeyBuf(0 To 119) As TypeKeySpec
End Type
Private m_strDataFilePath As String
Private m_byteFilePosBlk As TypePositionBlock
Private m_boolFileOpen As Boolean
Private m_boolEOF As Boolean
Private m_byteRecordBuffer() As Byte
Private m_intKeyNum As Integer
Private Sub Class_Initialize()
m_strDataFilePath = ""
m_boolFileOpen = False
m_boolEOF = True
m_intKeyNum = 0
End Sub
Private Function GetRecordLen() As Integer
Dim typeStat As TypeStatFileSpecs
Dim strKeyBuffer As String
Dim lngDataBufferLen As Long
Dim intKeyBufferLen As Integer
Dim intStatus As Integer
lngDataBufferLen = Len(typeStat)
strKeyBuffer = Space$(KEY_BUFFER_LEN)
intKeyBufferLen = KEY_BUFFER_LEN
intStatus = BTRCALL(B_STAT, m_byteFilePosBlk, typeStat, lngDataBufferLen, _
ByVal strKeyBuffer, KEY_BUFFER_LEN, 0)
If (intStatus = 0) Then
'Successfull
GetRecordLen = typeStat.RecLen
End If
End Function
Public Sub CloseConnection()
Dim intStatus As Integer
intStatus = BTRCALL(B_CLOSE, m_byteFilePosBlk, "", 0, 0, 0, 0)
If (intStatus = 0) Then
m_boolFileOpen = False
End If
End Sub
Public Sub GetFirst(Optional ByVal pintKey As Integer = 0)
Dim lngDataBufferLen As Long
Dim strKeyBuffer As String
Dim intKeyBufferLen As Integer
Dim intStatus As Integer
If (m_boolFileOpen) Then
lngDataBufferLen = UBound(m_byteRecordBuffer)
strKeyBuffer = Space$(KEY_BUFFER_LEN)
intKeyBufferLen = KEY_BUFFER_LEN
intStatus = BTRCALL(B_GETFIRST, m_byteFilePosBlk, m_byteRecordBuffer(1), lngDataBufferLen, _
ByVal strKeyBuffer, intKeyBufferLen, pintKey)
If (intStatus = 0) Then
m_intKeyNum = pintKey
m_boolEOF = False
End If
End If
End Sub
Public Sub GetNextExtended()
Dim lngDataBufferLen As Long
Dim strKeyBuffer As String
Dim intStatus As Integer
If (m_boolFileOpen) Then
lngDataBufferLen = UBound(m_byteRecordBuffer) + 1
strKeyBuffer = Space$(KEY_BUFFER_LEN)
intStatus = BTRCALL(B_GETNEXTEXTENDED, m_byteFilePosBlk, m_byteRecordBuffer(0), lngDataBufferLen, _
ByVal strKeyBuffer, Len(strKeyBuffer), m_intKeyNum)
If (intStatus = 9 Or intStatus = 64) Then
m_boolEOF = True
Else
If (intStatus = 0) Then
m_boolEOF = False
Else
Debug.Assert False
End If
End If
End If
End Sub
Public Sub OpenConnection(Optional ByVal pstrDataFilePath As String)
Dim typeDataBuffer As TypeOwner
Dim strKeyBuffer As String
Dim lngDataBufferLen As Long
Dim intStatus As Integer
typeDataBuffer.Owner = ""
m_strDataFilePath = pstrDataFilePath
lngDataBufferLen = Len(typeDataBuffer)
strKeyBuffer = Chr(34) & m_strDataFilePath & Chr(34)
intStatus = BTRCALL(B_OPEN, _
m_byteFilePosBlk, _
typeDataBuffer, _
lngDataBufferLen, _
ByVal strKeyBuffer, _
KEY_BUFFER_LEN, _
0)
If (intStatus = 0) Then
m_boolFileOpen = True
ReDim m_byteRecordBuffer(1 To GetRecordLen)
End If
End Sub
Public Property Get DataFilePath() As String
DataFilePath = m_strDataFilePath
End Property
Public Property Let DataFilePath(ByVal pstrValue As String)
m_strDataFilePath = pstrValue
End Property
Public Property Get EOF() As Boolean
EOF = m_boolEOF
End Property
Public Property Get Record() As Byte()
Record = m_byteRecordBuffer
End Property
Public Property Let Record(ByRef pbytValue() As Byte)
m_byteRecordBuffer = pbytValue
End Property
Here is an excerpt of the MKDE trace log where the 'UC' option is used which results in the same record being returned repeatedly:
MicroKernel Database Engine [Workstation Edition] for Windows NT/95/98
trace file
Created : 24 January 2011 16:04:28
<In> 0001 Opcode : 0026 Crs ID : 0xffffffff Db Length : 00005
Keynum : ff Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d19 Time : Mon Jan 24 16:04:28 2011
DBuf: 00 00 00 00 00 - .....
KBuf: ?? - .
<Out>0001 Status : 0000 Crs ID : 0xffffffff Db Length : 00005
Keynum : ff Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d19 Time : Mon Jan 24 16:04:28 2011
DBuf: 07 00 5a 00 39 - ..Z.9
KBuf: ?? - .
---------------------------------------------------------------------
<In> 0002 Opcode : 0000 Crs ID : 0xffffffff Db Length : 00008
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d1a Time : Mon Jan 24 16:04:28 2011
DBuf: 4e 4f 54 53 48 4f 57 4e - 00 NOTSHOWN.
KBuf: 43 3a 5c 50 61 73 74 65 - 6c 30 39 5c 5f 44 65 6d C:\Pastel09\_Dem
6f 5c 61 63 63 72 65 63 - 70 74 2e 64 61 74 00 00 o\accrecpt.dat..
00 00 00 0c bd 06 d4 84 - 6b 3e 3a 47 ac 10 5e 78 ....½.Ô„k>:G¬.^x
File: "C:\Pastel09\_Demo\accrecpt.dat"
<Out>0002 Status : 0000 Crs ID : 0x00010000 Db Length : 00008
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d1d Time : Mon Jan 24 16:04:28 2011
DBuf: 4e 4f 54 53 48 4f 57 4e - 00 NOTSHOWN.
KBuf: 43 3a 5c 50 61 73 74 65 - 6c 30 39 5c 5f 44 65 6d C:\Pastel09\_Dem
6f 5c 61 63 63 72 65 63 - 70 74 2e 64 61 74 00 00 o\accrecpt.dat..
00 00 00 0c 43 4f 4d 50 - 32 5c 50 69 65 74 69 65 ....COMP2\Pietie
---------------------------------------------------------------------
<In> 0003 Opcode : 0015 Crs ID : 0x00010000 Db Length : 00028
Keynum : fe Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d1d Time : Mon Jan 24 16:04:28 2011
DBuf: 00 00 d3 01 fe ff ff ff - 1e 23 9e 77 30 00 b0 01 ..Ó.þÿÿÿ.#žw0.°.
e8 cc 01 66 00 00 00 00 - 88 fe e9 05 èÌ.f.....þé.
KBuf: 00 00 00 00 00 00 01 00 - 88 fe e9 05 1c 00 00 00 .........þé.....
60 fe e9 05 00 00 b0 01 - 22 00 c9 01 00 00 00 00 `þé...°.".É.....
a4 03 00 00 b8 fe e9 01 - 68 00 b0 01 ff ff ff ff ¤...¸þé.h.°.ÿÿÿÿ
00 00 1a 00 08 00 00 00 - 00 07 db 4a 4d 81 4d 51 ..........ÛJM.MQ
00 00 00 00 ff ff ff ff - 00 00 00 00 00 00 00 00 ....ÿÿÿÿ........
00 00 f4 0c 57 52 f4 0c - ff 00 00 00 00 00 00 00 ..ô.WRô.ÿ.......
8c 5e 9d 77 9c 17 bb 75 - 9c 03 00 00 00 00 00 00 Œ^.wœ.»uœ.......
c4 17 bb 75 72 59 c5 fb - 00 00 00 00 00 00 00 00 Ä.»urYÅû........
<Out>0003 Status : 0000 Crs ID : 0x00010000 Db Length : 00013
Keynum : fe Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d1d Time : Mon Jan 24 16:04:28 2011
DBuf: 09 00 80 03 09 0d 10 08 - 0c 0c 0c 01 0a .............
KBuf: 00 00 00 00 00 00 01 00 - 88 fe e9 05 0d 00 00 00 .........þé.....
60 fe e9 05 00 00 b0 01 - 22 00 c9 01 00 00 00 00 `þé...°.".É.....
a4 03 00 00 b8 fe e9 01 - 68 00 b0 01 ff ff ff ff ¤...¸þé.h.°.ÿÿÿÿ
00 00 1a 00 08 00 00 00 - 00 07 db 4a 4d 81 4d 51 ..........ÛJM.MQ
00 00 00 00 ff ff ff ff - 00 00 00 00 00 00 00 00 ....ÿÿÿÿ........
00 00 f4 0c 57 52 f4 0c - ff 00 00 00 00 00 00 00 ..ô.WRô.ÿ.......
8c 5e 9d 77 9c 17 bb 75 - 9c 03 00 00 00 00 00 00 Œ^.wœ.»uœ.......
c4 17 bb 75 72 59 c5 fb - 00 00 00 00 00 00 00 00 Ä.»urYÅû........
---------------------------------------------------------------------
<In> 0004 Opcode : 0015 Crs ID : 0x00010000 Db Length : 01936
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d1e Time : Mon Jan 24 16:04:28 2011
DBuf: 33 00 cb ff ff ff ff ff - ff ff ff ff ff ff ff 00 3.Ëÿÿÿÿÿÿÿÿÿÿÿÿ.
00 00 00 00 00 00 00 00 - 00 80 03 09 0d 10 08 0c ................
0c 0c 01 0a 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 20 20 20 20 20 - 00 00 00 00 00 00 00 00 ... ........
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
KBuf: -
<Out>0004 Status : 0000 Crs ID : 0x00010000 Db Length : 00352
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d1e Time : Mon Jan 24 16:04:28 2011
DBuf: 80 03 00 04 09 00 04 00 - 00 00 00 03 03 00 00 00 ................
05 00 08 00 13 01 04 00 - 00 00 00 00 00 00 00 00 ................
0d 00 01 00 03 01 04 00 - 00 00 00 00 00 00 00 00 ................
0d 00 01 00 13 01 04 00 - 00 00 00 00 00 00 01 00 ................
01 00 04 00 13 01 04 00 - 00 00 01 00 00 00 01 00 ................
05 00 08 00 03 01 04 00 - 00 00 00 00 00 00 01 00 ................
05 00 08 00 13 01 04 00 - 00 00 00 00 00 00 02 00 ................
14 00 01 00 13 01 04 00 - 00 00 00 00 00 00 02 00 ................
15 00 07 00 03 01 04 00 - 00 00 00 00 00 00 02 00 ................
14 00 01 00 13 01 04 00 - 00 00 00 00 00 00 03 00 ................
15 00 07 00 03 01 04 00 - 00 00 00 00 00 00 03 00 ................
01 00 04 00 13 01 04 00 - 00 00 01 00 00 00 04 00 ................
05 00 08 00 03 01 04 00 - 00 00 00 00 00 00 04 00 ................
14 00 01 00 13 01 04 00 - 00 00 00 00 00 00 05 00 ................
15 00 07 00 13 01 04 00 - 00 00 00 00 00 00 05 00 ................
01 00 04 00 03 01 04 00 - 00 00 01 00 00 00 05 00 ................
KBuf: -
---------------------------------------------------------------------
<In> 0005 Opcode : 0012 Crs ID : 0x00010000 Db Length : 00896
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d1f Time : Mon Jan 24 16:04:28 2011
DBuf: 80 03 00 04 09 00 04 00 - 00 00 00 03 03 00 00 00 ................
05 00 08 00 13 01 04 00 - 00 00 00 00 00 00 00 00 ................
0d 00 01 00 03 01 04 00 - 00 00 00 00 00 00 00 00 ................
0d 00 01 00 13 01 04 00 - 00 00 00 00 00 00 01 00 ................
01 00 04 00 13 01 04 00 - 00 00 01 00 00 00 01 00 ................
05 00 08 00 03 01 04 00 - 00 00 00 00 00 00 01 00 ................
05 00 08 00 13 01 04 00 - 00 00 00 00 00 00 02 00 ................
14 00 01 00 13 01 04 00 - 00 00 00 00 00 00 02 00 ................
15 00 07 00 03 01 04 00 - 00 00 00 00 00 00 02 00 ................
14 00 01 00 13 01 04 00 - 00 00 00 00 00 00 03 00 ................
15 00 07 00 03 01 04 00 - 00 00 00 00 00 00 03 00 ................
01 00 04 00 13 01 04 00 - 00 00 01 00 00 00 04 00 ................
05 00 08 00 03 01 04 00 - 00 00 00 00 00 00 04 00 ................
14 00 01 00 13 01 04 00 - 00 00 00 00 00 00 05 00 ................
15 00 07 00 13 01 04 00 - 00 00 00 00 00 00 05 00 ................
01 00 04 00 03 01 04 00 - 00 00 01 00 00 00 05 00 ................
KBuf: 00 00 00 00 00 00 00 00 - 00 .........
<Out>0005 Status : 0000 Crs ID : 0x00010000 Db Length : 00896
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 00009d1f Time : Mon Jan 24 16:04:28 2011
DBuf: 01 00 00 00 52 43 31 30 - 30 30 30 31 01 05 41 42 ....RC100001..AB
43 44 45 44 41 41 41 41 - 41 41 41 67 00 1b 05 d8 CDEDAAAAAAAg...Ø
07 00 46 69 72 73 74 20 - 45 6e 74 72 79 20 20 20 ..First Entry
20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20
20 20 20 20 20 20 20 20 - 20 20 00 00 00 00 00 00 ......
00 00 59 40 00 00 00 00 - 00 00 24 40 00 00 00 00 ..Y@......$@....
00 c0 72 40 00 00 00 00 - 00 00 00 00 00 00 00 00 .Àr@............
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................
00 00 00 00 00 00 00 00 - 00 00 00 00 41 6c 62 6f ............Albo
74 74 20 4c 69 6d 69 74 - 65 64 20 20 20 20 20 20 tt Limited
20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20
20 20 20 20 31 34 2f 33 - 33 20 4f 66 66 69 63 65 14/33 Office
20 43 72 65 73 63 65 6e - 74 20 20 20 20 20 20 20 Crescent
KBuf: 52 43 31 30 30 30 30 31 - 01 RC100001.
---------------------------------------------------------------------
<In> 0006开发者_如何学Go Opcode : 0036 Crs ID : 0x00010000 Db Length : 00102
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 0000ad9b Time : Mon Jan 24 16:04:32 2011
DBuf: 10 00 55 43 00 00 00 00 - 01 00 01 00 5e 00 00 00 ..UC........^...
41 41 67 00 1b 05 d8 07 - 00 46 69 72 73 74 20 45 AAg...Ø..First E
6e 74 72 79 20 20 20 20 - 20 20 20 20 20 20 20 20 ntry
20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20
20 00 00 00 00 00 00 00 - 00 59 40 00 00 00 00 00 ........Y@.....
00 24 40 00 00 00 00 00 - c0 72 40 00 00 00 00 00 .$@.....Àr@.....
00 00 00 00 00 00 - ......
KBuf: 20 20 20 20 20 20 20 20 - 20
<Out>0006 Status : 0000 Crs ID : 0x00010000 Db Length : 00102
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 0000ad9c Time : Mon Jan 24 16:04:32 2011
DBuf: 01 00 5e 00 00 0b 00 00 - 01 00 00 00 52 43 31 30 ..^.........RC10
30 30 30 31 01 05 41 42 - 43 44 45 44 41 41 41 41 0001..ABCDEDAAAA
41 41 41 67 00 1b 05 d8 - 07 00 46 69 72 73 74 20 AAAg...Ø..First
45 6e 74 72 79 20 20 20 - 20 20 20 20 20 20 20 20 Entry
20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20
20 20 00 00 00 00 00 00 - 00 00 59 40 00 00 00 00 ........Y@....
00 00 24 40 00 00 - ..$@..
KBuf: 52 43 31 30 30 30 30 31 - 01 RC100001.
---------------------------------------------------------------------
<In> 0007 Opcode : 0036 Crs ID : 0x00010000 Db Length : 00102
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 0000b345 Time : Mon Jan 24 16:04:34 2011
DBuf: 10 00 55 43 00 00 00 00 - 01 00 01 00 5e 00 00 00 ..UC........^...
30 30 30 31 01 05 41 42 - 43 44 45 44 41 41 41 41 0001..ABCDEDAAAA
41 41 41 67 00 1b 05 d8 - 07 00 46 69 72 73 74 20 AAAg...Ø..First
45 6e 74 72 79 20 20 20 - 20 20 20 20 20 20 20 20 Entry
20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20
20 20 00 00 00 00 00 00 - 00 00 59 40 00 00 00 00 ........Y@....
00 00 24 40 00 00 - ..$@..
KBuf: 20 20 20 20 20 20 20 20 - 20
<Out>0007 Status : 0000 Crs ID : 0x00010000 Db Length : 00102
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 0000b345 Time : Mon Jan 24 16:04:34 2011
DBuf: 01 00 5e 00 00 0b 00 00 - 01 00 00 00 52 43 31 30 ..^.........RC10
30 30 30 31 01 05 41 42 - 43 44 45 44 41 41 41 41 0001..ABCDEDAAAA
41 41 41 67 00 1b 05 d8 - 07 00 46 69 72 73 74 20 AAAg...Ø..First
45 6e 74 72 79 20 20 20 - 20 20 20 20 20 20 20 20 Entry
20 20 20 20 20 20 20 20 - 20 20 20 20 20 20 20 20
20 20 00 00 00 00 00 00 - 00 00 59 40 00 00 00 00 ........Y@....
00 00 24 40 00 00 - ..$@..
KBuf: 52 43 31 30 30 30 30 31 - 01 RC100001.
---------------------------------------------------------------------
<In> 0012 Opcode : 0001 Crs ID : 0x00010000 Db Length : 00000
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 0000d735 Time : Mon Jan 24 16:04:43 2011
DBuf: ?? - .
KBuf: ?? - .
<Out>0012 Status : 0000 Crs ID : 0x00000000 Db Length : 00000
Keynum : 00 Clnt ID : 00 00 00 00 00 00 00 00 00 00 F4 0C 57 52 F4 0C
Clock : 0000d737 Time : Mon Jan 24 16:04:43 2011
DBuf: ?? - .
KBuf: ?? - .
---------------------------------------------------------------------
Just a note on the trace log, from transaction 0008 to 0011 all the data is excactly the same as 0007 so those entries were left out for some much needed brevity. After 0011 I stopped the loop manually since it would just keep on returning the same record indefinitely.
Okay, now I see the problem. Since you have the number of records to return set to 1, you will only get 1 record. Because you have it set for "UC", it will start with the current record and return one record... the same record, no matter how many times you run the code.
There is no magical "return all records in the table" in the GetNextExtended. You'll need to set the "number of records to return" to the number of records that will fit in approximately 62K. The maximum is really 64K minus some overhead. There's actually a formula in the PSQL documentation. Also, the "UC" option should only be used the first time GNE is called. After that, switch it to "EG" so it progresses down the records. You would continue with the GNE calls until status 9 (end of file) is returned.
精彩评论