----------------------------------------------------------------------------------------------
[BUG/PRB.] VFP 9.0 FIX - VARCHAR(MAX) FIELDS IN SQL SERVER ARE MAPPED TO C(0) FIELDS
January 2026
----------------------------------------------------------------------------------------------
CCB
1. BUG:
Microsoft has said for years that TEXT field type will be deprecated in SQL Server and VARCHAR(MAX) is the recommended replacement.
But in vfp9, VARCHAR(MAX) fields in SQL Server are mapped to C(0) fields, so it always returns an empty string.
The bug was reported by John Ryan.
2. CAUSE:
There are some BUGs in the following code.
3. RESOLUTION:
We can write some code to fix the BUG.
Fun88a599 :: ; proc near
push ebp ;0x0088a599 : 55
mov ebp , esp ;0x0088a59a : 8bec
push ecx ;0x0088a59c : 51
push ebx ;0x0088a59d : 53
push esi ;0x0088a59e : 56
push edi ;0x0088a59f : 57
mov edi , ecx ;0x0088a5a0 : 8bf9
lea ecx , dword ptr [ ebp - 4 ] ;0x0088a5a2 : 8d4dfc
imul edi , edi , 0158h ;0x0088a5a5 : 69ff58010000
push ecx ;0x0088a5ab : 51
xor ebx , ebx ;0x0088a5ac : 33db
push ebx ;0x0088a5ae : 53
push ebx ;0x0088a5af : 53
push ebx ;0x0088a5b0 : 53
mov esi , eax ;0x0088a5b1 : 8bf0
mov eax , dword ptr [ Data93b94c ] ;0x0088a5b3 : a14cb99300
mov eax , dword ptr [eax] ;0x0088a5b8 : 8b00
pushd 06h ;0x0088a5ba : 6a06
push dword ptr [ ebp + 8 ] ;0x0088a5bc : ff7508
push dword ptr [ edi + eax + 4 ] ;0x0088a5bf : ff740704
call dword ptr [ Data947b14 ] ;0x0088a5c3 : ff15147b9400
mov ecx , eax ;0x0088a5c9 : 8bc8
push ecx ;0x0088a5cb : 51
call Fun880072 ;0x0088a5cc : e8a15affff
test eax , eax ;0x0088a5d1 : 85c0
jne Label88a660 ;0x0088a5d3 : 0f8587000000
mov eax , dword ptr [ ebp - 4 ] ;0x0088a5d9 : 8b45fc
lea ecx , dword ptr [ ebp - 4 ] ;0x0088a5dc : 8d4dfc
push ecx ;0x0088a5df : 51
push ebx ;0x0088a5e0 : 53
push ebx ;0x0088a5e1 : 53
push ebx ;0x0088a5e2 : 53
mov dword ptr [ esi + 8 ] , eax ;0x0088a5e3 : 894608
mov eax , dword ptr [ Data93b94c ] ;0x0088a5e6 : a14cb99300
mov eax , dword ptr [eax] ;0x0088a5eb : 8b00
pushd 09h ;0x0088a5ed : 6a09
push dword ptr [ ebp + 8 ] ;0x0088a5ef : ff7508
push dword ptr [ edi + eax + 4 ] ;0x0088a5f2 : ff740704
call dword ptr [ Data947b14 ] ;0x0088a5f6 : ff15147b9400
mov ecx , eax ;0x0088a5fc : 8bc8
push ecx ;0x0088a5fe : 51
call Fun880072 ;0x0088a5ff : e86e5affff
test eax , eax ;0x0088a604 : 85c0
jne Label88a660 ;0x0088a606 : 7558
cmp dword ptr [ ebp - 4 ] , ebx ;0x0088a608 : 395dfc
lea ecx , dword ptr [ ebp + 10 ] ;0x0088a60b : 8d4d0a
push ecx ;0x0088a60e : 51
setne al ;0x0088a60f : 0f95c0
xor al , byte ptr [ esi + 18 ] ;0x0088a612 : 324612
lea ecx , dword ptr [ esi + 16 ] ;0x0088a615 : 8d4e10
push ecx ;0x0088a618 : 51
and al , 01h ;0x0088a619 : 2401
xor byte ptr [ esi + 18 ] , al ;0x0088a61b : 304612
mov eax , dword ptr [ Data93b94c ] ;0x0088a61e : a14cb99300
mov eax , dword ptr [eax] ;0x0088a623 : 8b00
lea ecx , dword ptr [ esi + 12 ] ;0x0088a625 : 8d4e0c
push ecx ;0x0088a628 : 51
add esi , 04h ;0x0088a629 : 83c604
push esi ;0x0088a62c : 56
lea ecx , dword ptr [ ebp + 18 ] ;0x0088a62d : 8d4d12
push ecx ;0x0088a630 : 51
push dword ptr [ ebp + 16 ] ;0x0088a631 : ff7510
push dword ptr [ ebp + 12 ] ;0x0088a634 : ff750c
push dword ptr [ ebp + 8 ] ;0x0088a637 : ff7508
push dword ptr [ edi + eax + 4 ] ;0x0088a63a : ff740704
call dword ptr [ Data947ba4 ] ;0x0088a63e : ff15a47b9400
mov ecx , eax ;0x0088a644 : 8bc8
push ecx ;0x0088a646 : 51
call Fun880072 ;0x0088a647 : e8265affff
test eax , eax ;0x0088a64c : 85c0
jne Label88a660 ;0x0088a64e : 7510
;
; -----------------------------------------------------------------------------------
; VFP 9.0 FIX - VARCHAR(MAX) FIELDS IN SQL SERVER ARE MAPPED TO C(0) FIELDS
; September 2018
; -----------------------------------------------------------------------------------
; CCB
;
; In vfp9, VARCHAR(MAX) fields in SQL Server are mapped to C(0) fields,
; VARBINARY(MAX) fields in SQL Server are mapped to Q(0) fields (CURSORSETPROP("MapBinary",.T.)) or Memo (Binary) fields (CURSORSETPROP("MapBinary",.F.)),
; XML fields in SQL Server are mapped to C(0) fields.
; In VFP Advanced, VARCHAR(MAX) fields in SQL Server are mapped to Memo fields,
; VARBINARY(MAX) fields in SQL Server are mapped to Blob fields (CURSORSETPROP("MapBinary",.T.)), General fields or Memo (Binary) fields (CURSORSETPROP("MapBinary",.F.)),
; XML fields in SQL Server are mapped to Memo fields.
;
; 2018/9/30, by ccb
;
; SQL_VARCHAR (12)
cmp word ptr [esi] , 0Ch
je Label88a650_varchar
; SQL_WVARCHAR (-9)
cmp word ptr [esi] , 0FFF7h
je Label88a650_nvarchar
; SQL_VARBINARY (-3)
cmp word ptr [esi] , 0FFFDh
je Label88a650_varbinary
; SQL_SS_XML (-152)
cmp word ptr [esi] , 0FF68h
je Label88a650_xml
jmp Label88a650
Label88a650_varchar ::
cmp dword ptr [esi+4] , 00h
jne Label88a650
cmp dword ptr [esi+8] , 00h
jne Label88a650
mov dword ptr [esi+4] , 07FFFFFFFh
mov dword ptr [esi+8] , 07FFFFFFFh
cmp dword ptr vfpa_sys9135_data,00h
je Label88a650
; SQL_LONGVARCHAR (-1)
mov word ptr [esi] , 0FFFFh
jmp Label88a650
Label88a650_nvarchar ::
cmp dword ptr [esi+4] , 00h
jne Label88a650
cmp dword ptr [esi+8] , 00h
jne Label88a650
mov dword ptr [esi+4] , 07FFFFFFFh
mov dword ptr [esi+8] , 07FFFFFFFh
cmp dword ptr vfpa_sys9135_data,00h
je Label88a650
; SQL_WLONGVARCHAR (-10)
mov word ptr [esi] , 0FFF6h
jmp Label88a650
Label88a650_varbinary ::
cmp dword ptr [esi+4] , 00h
jne Label88a650
cmp dword ptr [esi+8] , 00h
jne Label88a650
mov dword ptr [esi+4] , 07FFFFFFFh
mov dword ptr [esi+8] , 07FFFFFFFh
cmp dword ptr vfpa_sys9136_data,00h
je Label88a650
; SQL_LONGVARBINARY (-4)
mov word ptr [esi] , 0FFFCh
jmp Label88a650
Label88a650_xml ::
cmp dword ptr [esi+4] , 00h
jne Label88a650
cmp dword ptr [esi+8] , 00h
jne Label88a650
mov dword ptr [esi+4] , 03FFFFFFFh
mov dword ptr [esi+8] , 03FFFFFFFh
cmp dword ptr vfpa_sys9137_data,00h
je Label88a650
; SQL_WLONGVARCHAR (-10)
mov word ptr [esi] , 0FFF6h
jmp Label88a650
Label88a650 ::
mov esi , dword ptr [ ebp + 20 ] ;0x0088a650 : 8b7514
cmp esi , ebx ;0x0088a653 : 3bf3
je Label88a660 ;0x0088a655 : 7409
cmp word ptr [ ebp + 10 ] , bx ;0x0088a657 : 66395d0a
setne al ;0x0088a65b : 0f95c0
mov dword ptr [esi] , eax ;0x0088a65e : 8906
Label88a660 ::
pop edi ;0x0088a660 : 5f
pop esi ;0x0088a661 : 5e
mov ax , cx ;0x0088a662 : 668bc1
pop ebx ;0x0088a665 : 5b
leave ;0x0088a666 : c9
ret 010h ;0x0088a667 : c21000
Now in VFP Advanced, VARCHAR(MAX) fields in SQL Server are mapped to Memo fields,
VARBINARY(MAX) fields in SQL Server are mapped to Blob fields (CURSORSETPROP("MapBinary",.T.)), General fields or Memo (Binary) fields (CURSORSETPROP("MapBinary",.F.)),
XML fields in SQL Server are mapped to Memo fields.
4. APPLIES TO:
VFP 6.0.8167.0
VFP 6.0.8961.0 (SP5)
VFP 7.0.0.9262
VFP 7.0.0.9465 (SP1)
VFP 8.0.0.2521
VFP 8.0.0.3117 (SP1)
VFP 9.0.0.2412
VFP 9.0.0.3504 (SP1)
VFP 9.0.0.4611 (SP2)
VFP 9.0.0.5015 (SP2)
VFP 9.0.0.5411 (SP2)
VFP 9.0.0.5721 (SP2)
VFP 9.0.0.5815 (SP2)
VFP 9.0.0.6303 (SP2)
VFP 9.0.0.6602 (SP2)
VFP 9.0.0.7423 (SP2)
The bug has been fixed in VFP Advanced.
5. REFERENCE WEBSITES:
1, baiyujia.com:
http://www.baiyujia.com
http://www.baiyujia.com/vfpdocuments/f_vfp9fix273.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix274.asp
http://www.baiyujia.com/vfpdocuments/f_vfp9fix275.asp
2, foxite.com:
https://www.foxite.com/archives/sql-varcharmax-vs-memo-0000433414.htm
https://www.foxite.com/archives/warning-possible-bug-sql-server-0000239346.htm
https://www.foxite.com/archives/sql-server-2008-varbinarymax-0000410009.htm
3, microsoft.com:
https://technet.microsoft.com/en-us/library/ms171931(v=sql.105).aspx
https://social.msdn.microsoft.com/Forums/en-US/ee9c97ea-0dfb-4337-877b-37db710885d5/refresh-function-and-recordrefresh-does-not-refresh-memo
4, tek-tips.com:
https://www.tek-tips.com/viewthread.cfm?qid=1776880
5, easysoft.com:
https://www.easysoft.com/developer/languages/c/examples/ListDataTypes.html
6. OTHER:
For reference only, there is no guarantees.
Any questions or suggestions, please send me an email at ccb2000@163.com.
|