📄 simplyasynchronousread.prg
字号:
LOCAL lnTotalFetchRec,lnTotalRec
nHandle=SQLSTRINGCONNECT("Driver=SQL Server;Server=(local);UID=sa;PWD=;Database=Northwind")
IF nHandle<=0
=MESSAGEBOX("连接数据库服务器失败",0+48,"提示")
RETURN
ENDIF
=SQLSETPROP(nHandle,"Asynchronous",.F.) &&设置为同步传输
lnTotalRec=0 &&用于存储要读取记录的总数
nResult=SQLEXEC(nHandle,"SELECT COUNT(*) AS TotalRec FROM Orders","curMax")
IF nResult=1
lnTotalRec=curMax.TotalRec
ELSE
=MESSAGEBOX("读取记录总数出错")
=SQLDISCONNECT(nHandle)
RETURN
ENDIF
=CURSORSETPROP("FetchAsNeeded",.T.,0) &&设置按需要下载
=CURSORSETPROP("FetchSize",1,0) &&设置每次读取1条记录,在实际编程时应当加大该值
=SQLSETPROP(nHandle,"Asynchronous",.T.) &&设置为异步传输
PUBLIC llCancel
llCancel=.T.
SET ESCAPE ON &&设置可以通过按ESC来终止数据读取
ON ESCAPE CancelRead(nHandle)
IF USED("curOrders")
USE IN curOrders
ENDIF
DO WHILE NOT USED("curOrders") AND llCancel=.T. &&尝试读取第1条记录
nResult=SQLEXEC(nHandle,"SELECT * FROM Orders", "curOrders")
ENDDO
lnTotalFetchRec=0 &&用于存储已读取到的记录总数
IF USED("curOrders")
IF lnTotalFetchRec<lnTotalRec
lnTotalFetchRec=lnTotalFetchRec+1 &&curOrders表可用,表示读取到了1条记录
_VFP.StatusBar="总记录数:"+STR(lnTotalRec)+"已读取:"+STR(lnTotalFetchRec)+;
"完成"+STR(INT(lnTotalFetchRec*100/lnTotalRec))+"%"
ELSE
RETURN
ENDIF
=CURSORSETPROP("FetchAsNeeded",.F.,"curOrders") &&重新设置要读取全部记录
ENDIF
nResult=0
DO WHILE nResult=0 AND llCancel=.T.
*!* 下面的SELECT语句不会被重新提交,VFP会检测到这只是一个状态监测
*!* 只有在全部读取完毕,SQLEXEC才返回1,正在执行查询,将一直返回0
*!* 根据前面的设置,每次读取1条记录到curOrders表
nResult=SQLEXEC(nHandle,"SELECT * FROM Orders", "curOrders")
IF lnTotalFetchRec<lnTotalRec
lnTotalFetchRec=lnTotalFetchRec+1 &&curOrders表可用,表示读取到了1条记录
ELSE
lnTotalFetchRec=lnTotalRec
ENDIF
_VFP.StatusBar="总记录数:"+STR(lnTotalRec)+"已读取:"+STR(lnTotalFetchRec)+;
"完成"+STR(INT(lnTotalFetchRec*100/lnTotalRec))+"%"
ENDDO
=SQLDISCONNECT(nHandle) &&断开连接
SELECT curOrders
BROWSE NOWAIT
PROCEDURE CancelRead
LPARAMETERS nHandle
=SQLCANCEL(nHandle) &&终止读取
llCancel=.F.
ENDPROC
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -