4

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

(旧的源代码在选择和位置的任何地方都显示 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 的信息,但我在 Database Profile Setup 中看不到 DBParms 输入区域。似乎在 12.5 之前的某些版本中,您可以直接在某个框中输入 DBParm 值。但是在 12.5 中,它们只有复选框和下拉菜单来设置 DBParm 的值。而且我没有看到可以转化为为 SQLQualifiers 设置值的选择。根据文档: SQLQualifiers=1 --在 SQL 语句中使用所有者名称限定标识符。

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

欢迎提出想法!

4

3 回答 3

2

您描述的问题是一个常见的问题。

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

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

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

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

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

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

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

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

其他解决方案和注意事项

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

于 2012-11-12T09:35:26.933 回答
1

最短的解决方案是,在 DataWindow 的 SQL Painter 中,转到菜单Design / Convert to Syntax并自己手动编辑 SQL 语法。(坦率地说,我发现图形绘制器非常有限,并且比帮助我更慢;这通常是我创建 DataWindow 的第一步。)

我想可能有一些技巧和调整高度依赖于 DBMS(而且我还没有看到提到的 DBMS),比如将您的帐户分配为相关数据库数据库所有者 (dbo),但以上内容会帮助您以最快的速度通过您当前的阻塞。

祝你好运,

特里。

于 2012-11-06T14:51:42.507 回答
0

I failed to mention before that we recently upgraded to Powerbuilder 12.5 from 10.5. This is the first time that a data window has been modified since the conversion.

Today I looked carefully at the SQL Painter for this data window and clicked on the 'WHERE' tab. Under column, it said dbo.FieldAuxs.id (which was the fully qualified name that appeared in the WHERE clause). Before, I didn't realize that this was a drop down since the arrow doesn't show until you select this widget. When I dropped it to see the choices, none were fully qualified, i.e. none were prefixed with the table owner dbo). I chose FieldAuxs.id and saved the data window. Now the auto generated select statement consistently does NOT include dbo. as a prefix.

It looks as if dbo.FieldAuxs.id was a artifact of version 10.5 when the former programmer chose to use fully qualified column names in his database profile.

于 2012-11-06T17:56:52.533 回答