Deployment Powerbuilder数据存储仅在作为EXE部署时失败(但作为DataWindow成功)

Deployment Powerbuilder数据存储仅在作为EXE部署时失败(但作为DataWindow成功),deployment,powerbuilder,datastore,datawindow,Deployment,Powerbuilder,Datastore,Datawindow,我有一个应用程序,它在开发环境中工作得很好,但作为EXE部署时会出现错误。单击deploy并生成EXE时,所有通过数据存储对象运行的查询都会成功(SQLCode 0),但返回零行。出于沮丧,我改为visible datawindows,它在EXE下神奇地再次工作。因此,我使数据窗口不可见,并继续工作。这太奇怪了。我有另一个powerbuilder应用程序,它要大得多,使用了很多数据存储对象(在同一个数据库上),这些都很好用 DataStore ds_wacn ds_wacn = create

我有一个应用程序,它在开发环境中工作得很好,但作为EXE部署时会出现错误。单击deploy并生成EXE时,所有通过数据存储对象运行的查询都会成功(SQLCode 0),但返回零行。出于沮丧,我改为visible datawindows,它在EXE下神奇地再次工作。因此,我使数据窗口不可见,并继续工作。这太奇怪了。我有另一个powerbuilder应用程序,它要大得多,使用了很多数据存储对象(在同一个数据库上),这些都很好用

DataStore ds_wacn
ds_wacn  = create datastore
ds_wacn.DataObject = 'd_plateaccessions'
ds_wacn.SetTransObject(SQLCA)
ds_wacn.Retrieve(sLoad, iPlate)
IF SQLCA.SQLCode < 0 then ...
//  Succeeds in development, fetches zero rows under EXE

dw_wacn.SetTransObject(SQLCA)
dw_wacn.Retrieve(sLoad, iPlate)
IF SQLCA.SQLCode < 0 then ...
// Succeeds in development and in EXE
数据存储
ds_wacn=创建数据存储
ds_wacn.DataObject='d_plateaccessions'
ds_wacn.SetTransObject(SQLCA)
ds_wacn.Retrieve(sLoad、iPlate)
如果SQLCA.SQLCode<0,则。。。
//开发成功,在EXE下获取零行
dw_wacn.SetTransObject(SQLCA)
dw_wacn.Retrieve(sLoad、iPlate)
如果SQLCA.SQLCode<0,则。。。
//在开发和EXE中获得成功

我非常小心地确保运行的应用程序和失败的应用程序使用相同的设置连接到数据库(但仍然可能存在问题)。这是Powerbuilder 11.5.1,很可能您的DataWindow对象没有被编译到EXE中

编译EXE时,PowerBuilder从应用程序对象开始,智能地尝试确定应包含哪些对象。由于d_plateaccessions仅在脚本中的字符串中引用,因此不包括它

有两种方法可以解决这个问题

您可以为包含数据窗口的PBL创建PBD。PBD创建盲目地包括PBL中的所有对象。这种方法非常流行,许多人只是将所有的PBL标记为PBD创建并部署PBD

您也可以为EXE创建一个PBR,告诉编译器强制某些数据窗口和图形文件进入EXE。如果您确实想要一个EXE,但不想构建适当的PBR,则可以使用生成PBR和脚本,使用报表将所有数据窗口和对象(以及查找所有相关图形)强制转换为已编译的EXE

祝你好运


Terry。

很可能您的DataWindow对象没有被编译到EXE中

编译EXE时,PowerBuilder从应用程序对象开始,智能地尝试确定应包含哪些对象。由于d_plateaccessions仅在脚本中的字符串中引用,因此不包括它

有两种方法可以解决这个问题

您可以为包含数据窗口的PBL创建PBD。PBD创建盲目地包括PBL中的所有对象。这种方法非常流行,许多人只是将所有的PBL标记为PBD创建并部署PBD

您也可以为EXE创建一个PBR,告诉编译器强制某些数据窗口和图形文件进入EXE。如果您确实想要一个EXE,但不想构建适当的PBR,则可以使用生成PBR和脚本,使用报表将所有数据窗口和对象(以及查找所有相关图形)强制转换为已编译的EXE

祝你好运


特里。

我对你的前4排有问题

DataStore ds_wacn
ds_wacn.DataObject = 'd_plateaccessions'
ds_wacn.SetTransObject(SQLCA)
dw_wacn.Retrieve(sLoad, iPlate)
你真的在dw_wacn而不是ds_wacn上检索吗

本地数据存储没有“创建”。 我不使用频繁的本地数据存储,但在本例中,我们的程序中的代码是这样的

dataStore ds_myDs
ds_myDds  = create datastore
ds_myDds.DataObject = 'myDataObject'
ds_myDds.SetTransObject(SQLCA)
ds_myDds.Retrieve( /*arguments or not*/)    

/*
some code    
*/

destroy ds_myDs

我对您的前4行有问题

DataStore ds_wacn
ds_wacn.DataObject = 'd_plateaccessions'
ds_wacn.SetTransObject(SQLCA)
dw_wacn.Retrieve(sLoad, iPlate)
你真的在dw_wacn而不是ds_wacn上检索吗

本地数据存储没有“创建”。 我不使用频繁的本地数据存储,但在本例中,我们的程序中的代码是这样的

dataStore ds_myDs
ds_myDds  = create datastore
ds_myDds.DataObject = 'myDataObject'
ds_myDds.SetTransObject(SQLCA)
ds_myDds.Retrieve( /*arguments or not*/)    

/*
some code    
*/

destroy ds_myDs

该死,不能投票支持你(缺乏声誉)。是的。就是这样。数据存储对象与查询同时引入。如果只有ds_wacn.DataObject='d_plateaccessions'会抛出错误。。。我不能告诉你有多少次我有一个误报,导致数据存储或运行时修改的datawindow完全不做任何事情。当然,如果它告诉我“无法创建datawindow,DataObject不存在”,我也会感到困惑!自从90年C++以来,编译器优化混乱一直没有真正的大脑思维。一顶带螺旋桨的帽子?你是制造PBL Peeper的那只科技猫吗?那个产品救了我几十次的命。是的,我是那个科技猫用手指的人。(键盘是猫的IT世界的瘟疫。)很高兴听到它的帮助。数据存储确实返回了一个错误。当没有DataWindow对象时,Retrieve返回-1。通常仅在发生错误时检查事务对象。通过从数据存储中继承一个用户对象并添加一个of_setDataObject方法,可以使数据存储更加可靠。这可以在设置对象名称后检查是否确实存在对象。Dang,不能投票支持你(缺乏声誉)。是的。就是这样。数据存储对象与查询同时引入。如果只有ds_wacn.DataObject='d_plateaccessions'会抛出错误。。。我不能告诉你有多少次我有一个误报,导致数据存储或运行时修改的datawindow完全不做任何事情。当然,如果它告诉我“无法创建datawindow,DataObject不存在”,我也会感到困惑!自从90年C++以来,编译器优化混乱一直没有真正的大脑思维。一顶带螺旋桨的帽子?你是制造PBL Peeper的那只科技猫吗?那个产品救了我几十次的命。是的,我是那个科技猫用手指的人。(键盘是猫的IT世界的瘟疫。)很高兴听到它的帮助。数据存储确实返回了一个错误。当没有DataWindow对象时,Retrieve返回-1。通常仅在发生错误时检查事务对象。通过从DataStor继承一个用户对象,可以使数据存储更加可靠