用两个函数基本上解决此世纪难题

WellSoft 2015-09-30 12:58:44

PB实现网络重新恢复后,系统自动重新连接数据库


//====================================================================
// 函数: of_ReConnectDB()
//--------------------------------------------------------------------
// 描述: 重新连接数据库
//--------------------------------------------------------------------
// 参数:
//--------------------------------------------------------------------
// 返回: integer
//--------------------------------------------------------------------
// 作者: 威迅科技 日期: 2015-09-29 14:49
//--------------------------------------------------------------------
// Copyright 2000-2020, All rights reserved.
//--------------------------------------------------------------------
// 修改历史:
//
//====================================================================

n_ws_dbservice lnv_dbsrv
Integer li_RtValue,li_Value
Integer li_i,li_Count
window lw_sheet[]
n_ws_attrib_class lnv_attrib

SELECT Col INTO :li_Value FROM ( SELECT 1 AS Col ) t1; /*判断是否能连接数据库*/
IF IsNull(li_Value) THEN li_Value = 0
IF li_Value = 1 THEN RETURN NO_ACTION

lnv_attrib.sTitle = "连接数据库"
lnv_attrib.sTips = "正在重新连接数据库,请稍候..."
lnv_attrib.sPicture = "Images\ConnectDB.gif"
of_PromptTips(TRUE,lnv_attrib)

IF SQLCA.of_IsConnected() THEN SQLCA.of_DisConnect() /*断开原来的连接*/

lnv_dbsrv = CREATE n_ws_dbservice

li_RtValue = lnv_dbsrv.of_InitConnect(is_AppIniFile) /*初始化数据库连接参数*/
IF li_RtValue = SUCCESS THEN
li_RtValue = lnv_dbsrv.of_ConnectDB() /*连接数据库*/
IF li_RtValue = SUCCESS THEN
IF IsValid(iw_frame) THEN
IF IsValid(iw_frame.inv_sheetManager) THEN
li_Count = iw_frame.inv_sheetManager.of_GetSheets(lw_sheet[]) /*取得sheet窗口*/
FOR li_i = 1 TO li_Count
of_ReConnectDB_Object(lw_sheet[li_i]) /*循环sheet窗口*/
NEXT
END IF
END IF
END IF
END IF

IF IsValid(lnv_dbsrv) THEN DESTROY lnv_dbsrv

of_PromptTips(FALSE)

RETURN li_RtValue




//====================================================================
// 函数: of_ReConnectDB_Object()
//--------------------------------------------------------------------
// 描述: 重新连接数据库
//--------------------------------------------------------------------
// 参数:
// value PowerObject apo_Object
//--------------------------------------------------------------------
// 返回: integer
//--------------------------------------------------------------------
// 作者: 威迅科技 日期: 2015-09-29 23:41
//--------------------------------------------------------------------
// Copyright 2000-2020, All rights reserved.
//--------------------------------------------------------------------
// 修改历史:
//
//====================================================================

Window lw_sheet
Tab ltb_Tab
UserObject luo_Object
u_dw ldw_dw
Integer li_i,li_Count

CHOOSE CASE apo_Object.TypeOf()
CASE Window!
lw_sheet = apo_Object
li_Count = UpperBound(lw_sheet.Control[])
FOR li_i = 1 TO li_Count
of_ReConnectDB_Object(lw_sheet.Control[li_i])
NEXT
CASE Tab!
ltb_Tab = apo_Object
li_Count = UpperBound(ltb_Tab.Control[])
FOR li_i = 1 TO li_Count
of_ReConnectDB_Object(ltb_Tab.Control[li_i])
NEXT
CASE UserObject!
luo_Object = apo_Object
li_Count = UpperBound(luo_Object.Control[])
FOR li_i = 1 TO li_Count
of_ReConnectDB_Object(luo_Object.Control[li_i])
NEXT
CASE DataWindow!
ldw_dw = apo_Object
IF IsValid(ldw_dw.inv_linkage) THEN
ldw_dw.inv_linkage.of_SetTransObject(SQLCA)
ELSE
IF ldw_dw.Visible THEN
ldw_dw.of_SetTransObject(SQLCA)
END IF
END IF
END CHOOSE

RETURN SUCCESS
...全文
4069 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
pcwe2002 2016-12-02
  • 打赏
  • 举报
回复
使用satrda不用这么麻烦,可以自动重连 http://blog.csdn.net/pcwe2002/article/details/52615255
WellSoft 2016-12-02
  • 打赏
  • 举报
回复
引用 17 楼 kennyfan 的回复:
请问楼主,这段代码是怎么定义的?iw_frame,iw_frame.inv_sheetManager是从何而来的呢?谢谢 IF IsValid(iw_frame) THEN IF IsValid(iw_frame.inv_sheetManager) THEN li_Count = iw_frame.inv_sheetManager.of_GetSheets(lw_sheet[]) /*取得sheet窗口*/ FOR li_i = 1 TO li_Count of_ReConnectDB_Object(lw_sheet[li_i]) /*循环sheet窗口*/ NEXT
这个也是pfc的东西.
妖风起 2016-12-02
  • 打赏
  • 举报
回复
kennyfan 2016-12-02
  • 打赏
  • 举报
回复
请问楼主,这段代码是怎么定义的?iw_frame,iw_frame.inv_sheetManager是从何而来的呢?谢谢 IF IsValid(iw_frame) THEN IF IsValid(iw_frame.inv_sheetManager) THEN li_Count = iw_frame.inv_sheetManager.of_GetSheets(lw_sheet[]) /*取得sheet窗口*/ FOR li_i = 1 TO li_Count of_ReConnectDB_Object(lw_sheet[li_i]) /*循环sheet窗口*/ NEXT
WellSoft 2016-04-08
  • 打赏
  • 举报
回复
引用 15 楼 cy0361 的回复:
[quote=引用 14 楼 yuan0801 的回复:] ldw_dw.inv_linkage.of_SetTransObject(SQLCA) 这个内容能分享一下么,数据库是重连上了,但是数据窗口在retrieve的时候总是不行呢
你好 这个怎么用的?[/quote] 这个是pfc的东西.
cy0361 2016-04-06
  • 打赏
  • 举报
回复
引用 14 楼 yuan0801 的回复:
ldw_dw.inv_linkage.of_SetTransObject(SQLCA) 这个内容能分享一下么,数据库是重连上了,但是数据窗口在retrieve的时候总是不行呢
你好 这个怎么用的?
yuan0801 2016-03-18
  • 打赏
  • 举报
回复
ldw_dw.inv_linkage.of_SetTransObject(SQLCA) 这个内容能分享一下么,数据库是重连上了,但是数据窗口在retrieve的时候总是不行呢
baojun8583 2016-01-19
  • 打赏
  • 举报
回复
引用 4 楼 lzp_lrp 的回复:
连接库重新连接后,要设置所有的数据窗口的事务对象
不错,在进行数据库操作之前,进行数据库连接判断。 如果断开,重新连接,再对当前已打开窗口的数据库对象重新设置SQLCA。 对偶发连接断开的应用非常有效。就是每次都要判断是否连接。
WellSoft 2015-11-13
  • 打赏
  • 举报
回复
引用 10 楼 xinlingsky 的回复:
怎么用啊,能指点一下吗?
在读写数据库前 of_ReConnectDB() 就可以了.
gzlx 2015-11-13
  • 打赏
  • 举报
回复
不错,问题是系统大了,会有各种事务联接,除了u_dw还有n_ds的所有事务
xinlingsky 2015-11-12
  • 打赏
  • 举报
回复
怎么用啊,能指点一下吗?
lao_bulls 2015-10-19
  • 打赏
  • 举报
回复
只懂pb, 用习惯了, 就象以前有个前辈说的: pb就象老情人一样, 打个眼色就知道要怎样了.
952 2015-10-10
  • 打赏
  • 举报
回复
good
WellSoft 2015-10-09
  • 打赏
  • 举报
回复
引用 6 楼 yishanhai 的回复:
难得还有人用pb,而且用的这么好
只懂pb, 用习惯了, 就象以前有个前辈说的: pb就象老情人一样, 打个眼色就知道要怎样了. 呵呵. 其它的比如 .NET等只懂皮毛, 搞来搞去就象是一个老穷屌丝搞18. 22靓女一样, 麻烦无法上手.
yishanhai 2015-10-08
  • 打赏
  • 举报
回复
难得还有人用pb,而且用的这么好
yishanhai 2015-10-08
  • 打赏
  • 举报
回复
WorldMobile 2015-10-08
  • 打赏
  • 举报
回复
连接库重新连接后,要设置所有的数据窗口的事务对象
坏朋朋 2015-10-05
  • 打赏
  • 举报
回复
n_ws_dbservice的内容在哪???
WellSoft 2015-10-05
  • 打赏
  • 举报
回复
引用 2 楼 HuaiPengPeng 的回复:
n_ws_dbservice的内容在哪???
这个是你连接数据库的脚本, 你可以自己写.
门外的码农 2015-10-05
  • 打赏
  • 举报
回复

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧