注册 登录
编程论坛 VFP论坛

当VFP读取SQL表时遇到网络偶尔断线出错时,如何再次尝试读取而不出现错误提示?

asis 发布于 2022-10-25 16:48, 1876 次点击
局域网是无线网络,稳定性不好,经常丢包,程序运行后会不断循环用计时器控件每20秒向SQL数据表读取数据,但遇到网络不稳定时,会由于读取超时出现读数据错误,
导致程序运行中断。

abc=1
do while abc=1

if SQLEXEC(CON,"SELECT * FROM GYKH ORDER BY 序号","GYKH")<1    &&当遇到网络不稳定时,此语句会由于超时而提示以下错误并退出循环

MESSAGEBOX('从服务器读取数据失败,请检查网络或服务器是否工作正常!',64,'提示')
retu
endif
*当按下ESC键时abc=2,退出循环
enddo

请问有没有什么办法,当遇到网络不稳定时,可以让程序多次或不断尝试再次从SQL读取数据直到成功为止,避免程序出错中断。非常感谢!
10 回复
#2
厨师王德榜2022-10-25 17:11
把连接的 ConnectTimeOut 属性设置得大一点.
还有 QueryTimeOut /WaitTime  属性都重新设置一下,不用他的默认值.

[此贴子已经被作者于2022-10-25 17:13编辑过]

#3
asis2022-10-25 17:25
=SQLSETPROP(0,"QueryTimeOut",10) && 一般超时等待(以秒计算0~600) 15
=SQLSETPROP(0,"WaitTime",1000) && 检查SQL语句是否结束时间间隔毫秒 500

[此贴子已经被作者于2022-10-25 17:42编辑过]

#4
liuxingang282022-10-26 09:04
当网络不稳定时,最可能出现的是连接句柄失效。因此,一个比较稳妥的做法是,先检查连接句柄,再执行SQL,如下所示:
IF CheckCon(nCon)<0 OR SQLEXEC(nCon,cSQL)<0
    MessageBox('从服务器读取数据失败!')
    RETURN
ENDIF
其中:CkechCOn()是一个检查连接是否有效的自定义函数,若连接无效,则重新连接。
一般来说,系统默认参数能够满足正常需求。若在默认参数下,还经常出现网络连接错误,则应该将精力放在改善网络硬件环境上。
#5
wxzd1232022-10-27 06:45
顶一下,看有什么好办法
#6
whinda2022-10-30 01:08
local err

try
    =SQLEXEC(blablabla...)
catch
    err=.t.
endtry
if err
    =execSQL(1)
endif

Procedure execSQL
    lparameter nCnt
    local err
    if nCnt>3&&尝试3次
    =messagbox('bad network encountered',0,'')&&---Sleep(400)延时?调用其它次级处理?
        return .f.
    endif
    try
        =SQLEXEC(blablabla...)
    catch
        err=.t.
    endtry
    if err
        =execSQL(nCnt+1)
    endif
endproc
#7
plsword2022-11-01 16:18
以下是引用liuxingang28在2022-10-26 09:04:24的发言:

当网络不稳定时,最可能出现的是连接句柄失效。因此,一个比较稳妥的做法是,先检查连接句柄,再执行SQL,如下所示:
IF CheckCon(nCon)<0 OR SQLEXEC(nCon,cSQL)<0
    MessageBox('从服务器读取数据失败!')
    RETURN
ENDIF
其中:CkechCOn()是一个检查连接是否有效的自定义函数,若连接无效,则重新连接。
一般来说,系统默认参数能够满足正常需求。若在默认参数下,还经常出现网络连接错误,则应该将精力放在改善网络硬件环境上。

大哥能公开一下CkechCOn()的代码吗?这个问题困扰我好久了
#8
my23182022-11-01 19:01
一般不是太频繁操作数据库,可以先连接数据库,再操作数据库,再断开数据库连接,下次操作时再重复以上三步,这样可以节约系统资源。检查连接是否有效可以使用sqlgetprop()函数,具体见帮助
#9
liuxingang282022-11-02 10:37
回复 7楼 plsword
CheckCon.prg 代码如下:
程序代码:
* [color=#808080]====================================================[/color]
* 功能: 检查连接句柄是否有效,无效时重新连接
* 参数: tnCon        连接句柄(实参)
* 返回: .t.[color=#808080]/.f.    成功/失败[/color]
* [color=#808080]====================================================[/color]

LPARAMETERS tnCon

* 检查连接是否有效
LOCAL nSqlState
IF TYPE('tnCon') # 'N' OR tnCon <= 0
    nSqlState = -1
ELSE
    TRY
        nSqlState = SQLEXEC(tnCon,"")
    CATCH
        nSqlState = -1
    ENDTRY
ENDIF

* 重建连接
IF nSqlState < 0
    LOCAL cSQL_Name,cSQL_Uid,cSQL_Pwd,cSQL_DB,cConStr
    cSQL_Name = '10.194.1.5'    && 服务器地址
    cSQL_Uid = 'sa'                && 用户名
    cSQL_Pwd = 'phoenix'        && 密码
    cSQL_DB = 'cpbj'            && 数据库
    cConStr = "DRIVER=SQL Server;SERVER=" +cSQL_Name +';UID=' +cSQL_Uid +';PWD=' +cSQL_Pwd +';DATABASE=' +cSQL_DB
    tnCon = SQLSTRINGCONNECT(cConStr)
    IF tnCon < 0
        MESSAGEBOX('与 SQL Server 数据库连接失败!',16,'提示')
    ENDIF
ENDIF

* 返回成功标记
RETURN (tnCon>0)


调用示例:
nCon = 0
cSql = 'select * from table1'
IF !CheckCon(@nCon) OR SQLEXEC(nCon,cSql,'curRet') < 0
    MESSAGEBOX('从服务器读取数据失败!',16,'提示')
    RETURN
ENDIF
#10
jsddx2022-11-02 16:22
学习
#11
schtg2022-11-02 20:13
回复 9楼 liuxingang28
谢谢分享!
1