| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1462 人关注过本帖
标题:当VFP读取SQL表时遇到网络偶尔断线出错时,如何再次尝试读取而不出现错误提 ...
只看楼主 加入收藏
asis
Rank: 1
等 级:新手上路
威 望:1
帖 子:43
专家分:7
注 册:2022-9-6
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:10 
当VFP读取SQL表时遇到网络偶尔断线出错时,如何再次尝试读取而不出现错误提示?
局域网是无线网络,稳定性不好,经常丢包,程序运行后会不断循环用计时器控件每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读取数据直到成功为止,避免程序出错中断。非常感谢!
搜索更多相关主题的帖子: 提示 读取 网络 错误 SQL 
2022-10-25 16:48
厨师王德榜
Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18
等 级:贵宾
威 望:199
帖 子:991
专家分:4966
注 册:2013-2-16
收藏
得分:4 
把连接的 ConnectTimeOut 属性设置得大一点.
还有 QueryTimeOut /WaitTime  属性都重新设置一下,不用他的默认值.

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

2022-10-25 17:11
asis
Rank: 1
等 级:新手上路
威 望:1
帖 子:43
专家分:7
注 册:2022-9-6
收藏
得分:0 
=SQLSETPROP(0,"QueryTimeOut",10) && 一般超时等待(以秒计算0~600) 15
=SQLSETPROP(0,"WaitTime",1000) && 检查SQL语句是否结束时间间隔毫秒 500

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

2022-10-25 17:25
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:4 
当网络不稳定时,最可能出现的是连接句柄失效。因此,一个比较稳妥的做法是,先检查连接句柄,再执行SQL,如下所示:
IF CheckCon(nCon)<0 OR SQLEXEC(nCon,cSQL)<0
    MessageBox('从服务器读取数据失败!')
    RETURN
ENDIF
其中:CkechCOn()是一个检查连接是否有效的自定义函数,若连接无效,则重新连接。
一般来说,系统默认参数能够满足正常需求。若在默认参数下,还经常出现网络连接错误,则应该将精力放在改善网络硬件环境上。

泉城飞狐
2022-10-26 09:04
wxzd123
Rank: 2
等 级:论坛游民
帖 子:394
专家分:69
注 册:2012-9-6
收藏
得分:4 
顶一下,看有什么好办法
2022-10-27 06:45
whinda
Rank: 6Rank: 6
等 级:贵宾
威 望:13
帖 子:253
专家分:418
注 册:2012-2-4
收藏
得分:4 
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
2022-10-30 01:08
plsword
Rank: 2
等 级:论坛游民
威 望:1
帖 子:22
专家分:27
注 册:2015-10-19
收藏
得分:4 
以下是引用liuxingang28在2022-10-26 09:04:24的发言:

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

大哥能公开一下CkechCOn()的代码吗?这个问题困扰我好久了
2022-11-01 16:18
my2318
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:258
专家分:640
注 册:2014-3-18
收藏
得分:4 
一般不是太频繁操作数据库,可以先连接数据库,再操作数据库,再断开数据库连接,下次操作时再重复以上三步,这样可以节约系统资源。检查连接是否有效可以使用sqlgetprop()函数,具体见帮助
2022-11-01 19:01
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
回复 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

泉城飞狐
2022-11-02 10:37
jsddx
Rank: 2
等 级:论坛游民
帖 子:44
专家分:25
注 册:2006-4-11
收藏
得分:0 
学习
2022-11-02 16:22
快速回复:当VFP读取SQL表时遇到网络偶尔断线出错时,如何再次尝试读取而不出现错 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014495 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved