PowerBuilder 12.5修改后的DataWindow不会使用表所有者限定列名

时间:2012-11-06 02:36:03

标签: powerbuilder datawindow

我正在尝试维护一个PowerBuilder程序,并且无法访问编写代码的前一个程序员。我修改了一个DataWindow,现在它生成的源代码不包括选择中列名中的表所有者(dbo)。但它在WHERE子句中包含了dbo。见下文。

(旧的源代码在选择和where中显示dbo.FieldAuxs。)

retrieve="PBSELECT( VERSION(400) TABLE(NAME=~"FieldAuxs~" ) 
COLUMN(NAME=~"FieldAuxs.id~") 
COLUMN(NAME=~"FieldAuxs.clientid~") 
COLUMN(NAME=~"FieldAuxs.status~") 
COLUMN(NAME=~"FieldAuxs.historyear~") 
WHERE(    EXP1 =~"dbo.FieldAuxs.id~"   OP =~"=~"    EXP2 =~":al_id~" ) ) ARG(NAME = ~"al_id~" TYPE = number) " update="FieldAuxs" updatewhere=1 updatekeyinplace=no arguments=(("al_id", number)) )

这会导致错误:列前缀dbo.FieldAuxs与查询中使用的表名或别名不匹配...

我的数据库配置文件正在以我(不是dbo)的身份登录PowerBuilder开发环境。我相信这就是我想要做的。

我已阅读有关将SQLCA.DBParm设置为SQLQualifiers = 1的信息,但我在数据库配置文件设置中看不到DBParms输入区域。在12.5之前的某个版本中,您可以直接在某个框中键入DBParm值。但是在12.5中他们只有复选框和下拉菜单来设置DBParm的值。我没有看到一个转换为为SQLQualifiers设置值的选择。根据文档:SQLQualifiers = 1 - 在SQL语句中使用所有者名称验证标识符。

我必须没有正确设置我的DataWindow自动生成源代码,该源代码仅在WHERE子句中而不是在Selection中完全限定列名。

欢迎提出意见!

3 个答案:

答案 0 :(得分:2)

您描述的问题很常见。

典型原因 - 在开发模式下使用不同数据库用户ID的开发人员

一名开发人员以“架构所有者”身份登录数据库(处于开发模式),另一名开发人员以标准用户身份登录数据库(处于开发模式)(例如john_doe)。

开发人员通常应该在开发或创建数据窗口时避免以架构所有者身份登录,尤其是在多架构数据库中,因为当用户在正常(非架构所有者)下运行应用程序时,数据窗口将失败用户身份。

尽管这在概念上很简单,但它始终会发生,因为开发人员经常可以访问开发中用于创建表或修改列等的架构/表所有者,然后他们忘记切换回正常userid连接开发数据窗口。

当PowerBuilder符合标识符时(来自PB12.5帮助)

如果表所有者的名称与登录到数据库的用户名相同,则PowerBuilder不会在其生成的SQL语句中使用所有者名称限定标识符。因此,如果您需要PowerBuilder来限定所有者名称,则需要使用不拥有该表的用户登录。

使用SQLQualifiers数据库参数(来自PB12.5帮助)

此参数不适用于大多数数据库。根据PB 12.5的文档,SQLQualifiers仅适用于 DIR Sybase DirectConnect

其他解决方案&注释

将数据窗口SQL转换为语法将起作用,但除非绝对必要,否则我通常会尽量避免这样做。你不应该转换为语法的原因是你失去了数据窗口内置的一些魔力。如果您正在处理支持两个或更多后端数据库的应用程序,则转换为语法将需要为每个DBMS创建一组单独的数据窗口。例如,考虑Oracle的左外连接语法与MS SQL Server相比,如果以语法编码,数据窗口将在一个数据库中工作,但是如果保留在图形模式下,PowerBuilder会根据所使用的DBMS自动使用正确的左外连接语法。在转换为超出原始问题范围的语法时,您还有许多其他优点(魔术)。

答案 1 :(得分:1)

最短的解决方案是,在DataWindow的SQL Painter中,转到菜单设计/转换为语法并自己手动编辑SQL语法。 (坦率地说,我发现图形画家非常有限并且减慢了我的速度而不是帮助我;这通常是我创建DataWindow的第一步。)

我想象的可能是提示和调整高度依赖于DBMS(我还没有看到提到的DBMS),比如将您的帐户指定为 数据库所有者(dbo)有关数据库,但上述内容可以让您最快地通过当前的阻塞。

祝你好运,

特里。

答案 2 :(得分:0)

之前我没有提到我们最近从10.5升级到Powerbuilder 12.5。这是自转换以来第一次修改数据窗口。

今天,我仔细查看了SQL Painter的数据窗口并单击了“WHERE”选项卡。在列下,它表示dbo.FieldAuxs.id(它是WHERE子句中出现的完全限定名称)。之前,我没有意识到这是一个下拉,因为箭头没有显示,直到你选择这个小部件。当我放弃它以查看选择时,没有一个是完全合格的,即没有一个以表所有者dbo为前缀。我选择了FieldAuxs.id并保存了数据窗口。现在,自动生成的select语句始终不包含dbo。作为前缀。

当前程序员选择在其数据库配置文件中使用完全限定的列名时,dbo.FieldAuxs.id看起来好像是版本10.5的工件。