我从Power Builder 10.5连接到Postgresql数据库,在Windows 7上使用ODBC ..我注意到PB将表所有者预先设置为表名,例如,如果我以“user”身份连接到数据库,那么将查询格式化为“SELECT x,y,z FROM user.tablename”。
这在Sybase中很有意义,但在postgres中无法正常工作,其中模式和用户是一个单独的东西。
我通过创建一个与用户同名的postgres模式进行测试,然后将表放在模式中。因此,当PB使用“username.tablename”postgres将其解释为“schemaname.tablename”并且这有效..但它只是一个测试,而不是一个可用的解决方案。
在文档中说如果表所有者与当前用户相同,PB将不会在所有者之前添加,但如果它们不匹配,则会。但是在我的测试程序中,我看到的是相反的情况:如果UID与所有者名称相同,则它会在前置,如果它们不匹配,则不会。
这是我的连接代码:
sqlca.DBMS = "ODBC"
sqlca.userid = "pblearn"
sqlca.dbpass = "pblearn"
string ls_DSN = "PBLEARN"
string ls_connect = "ConnectString='"
ls_connect += "DSN=" + ls_DSN + ";"
ls_connect += "UID=" + sqlca.userid + ";"
ls_connect += "PWD=" + sqlca.dbpass + "'"
sqlca.dbparm = ls_connect + ", SQLQualifiers=0"
connect;
我的模式是pblearn和public(默认)..以及两个用户“pblearn”和“pblearn2”。如果我连接pblearn,prepend发生,我看到pblearn(表的所有者)模式中的表,如果我使用pblearn2,用户名不是前置的,我在公共模式中看到表。
如何让PB不添加用户名,或者在用户之前添加一致的模式名称?
由于
答案 0 :(得分:0)
在您的安装所使用的PBODB105.INI
的数据库部分中,添加以下属性:
PBTableOwner='NO'
来自文档:
; PBTableOwner ='NO' - 不限定表名,默认为'YES'
编辑:
如果特定连接没有部分,那么Powerbuilder 作为ODBC兼容的客户端和可能的扩展运行 可用不能使用。搜索算法 条目是:
IF section and entry for are present current datasource
THEN use entry value
ELSE IF section corresponding to DBMS_Name Driver_Name exist
THEN use entry value if it exist
ELSE IF section corresponding to DBMS_Name exist
THEN use entry value if it exist
部分标题
因此,为Postgres安装添加部分的最简单方法是创建一个以当前数据源名称命名的部分,或者如果您更喜欢使用DBMS_NAME,请检查以下示例:http://www.rgagnon.com/pbdetails/pb-0061.html以查看返回的DBMS名称通过ODBC驱动程序。