使用 Worklight 6.1.0 触发选择查询时出现 DB2 SQL 错误?

Posted

技术标签:

【中文标题】使用 Worklight 6.1.0 触发选择查询时出现 DB2 SQL 错误?【英文标题】:Getting DB2 SQL Error while firing a select query using Worklight 6.1.0? 【发布时间】:2014-07-22 06:12:24 【问题描述】:

我正在尝试使用 worklight 6.1.0 连接到本地 LAN 中的 DB2,并触发 Select Query 以查找数据(如果存在)。但我得到以下错误:


       "errors": [
          "Runtime: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DATABASE_NAME.REGISTRATION, DRIVER=3.58.82.\nPerformed query:\nSELECT * FROM DATABASE_NAME.registration where DATABASE_NAME.registration.Mob_No = ?"
       ],
       "info": [
       ],
       "isSuccessful": false,
       "warnings": [
       ]
    

我的 SQL 适配器配置如下所示:

<connectionPolicy xsi:type="sql:SQLConnectionPolicy">
            <!-- Example for using a JNDI data source, replace with actual data source name -->
            <!-- <dataSourceJNDIName>java:/data-source-jndi-name</dataSourceJNDIName> -->

            <!-- Example for using mysql connector, do not forget to put the MySQL connector library in the project's lib folder -->
            <dataSourceDefinition>
                 <driverClass>com.ibm.db2.jcc.DB2Driver</driverClass>
                <url>jdbc:db2://172.21.11.129:50000/MOBILEDB</url>
                <user>db2admin</user>
                <password>Newuser123</password>
            </dataSourceDefinition>
        </connectionPolicy>

其中有程序的js文件如下:

var selectStatement1 = "SELECT * FROM DATABASE_NAME.registration where DATABASE_NAME.registration.Mob_No = ?";
var procStmt1 = WL.Server.createSQLStatement(selectStatement1);

function registrationLookup(mobile)

WL.Logger.debug("Inside registrationLookup");

return WL.Server.invokeSQLStatement(
        
            preparedStatement : procStmt1,
            parameters : [mobile]
        
);

我做了一些关于将 DB2 与 Worklight 连接的研究,发现我需要将以下数据放入 worklight.properties 文件中。

wl.db.username=db2admin
wl.db.type=DB2
wl.db.password=Newuser123
wl.db.driver=com.ibm.db2.jcc.DB2Driver

但添加后,我无法部署适配器,并且错误提示“db2admin”不存在。所以我在当前问题的背景下跳过了这一步。但是在经历了我没有添加这个 worklight.properties 数据的错误之后,在我看来,根据 http://www-01.ibm.com/support/docview.wss?uid=swg21613531 或用户表不存在“对象不存在”。任何建议都会有所帮助。 注意:

    我的 IP 地址是 172.21.11.125,我从那里调用 Adapter for DB2。 DB2 实例正在 172.21.11.129 @ 50000 上运行。 已经在 server/lib 中添加了 db2jcc_license_cu_9.5.jar 和 db2jcc_9.5.jar。它的名称附加了“_9.5”,我已经从两个 jar 中删除了它,只保留了 db2jcc_license_cu.jar 和 db2jcc.jar。

【问题讨论】:

DATABASE_NAME 真的是您的数据库/模式的名称吗?这似乎不是一个非常清晰/有用的名称。 db 抱怨 registration 表不存在(或者无论如何都找不到它),所以它可能不是用户表问题。我对 Worklight 的了解不够多——js 是分发给客户端的吗?如果您让客户端运行任意 SQL 语句,这样做似乎会导致灾难。否则这是一个明确提出的问题 - 我希望更多的人会提供遇到的错误的全文,更不用说他们尝试的步骤...... 我想,我的问题确实有点错误,让我澄清一下 Database_Name=MOBILEDB, SCHEMA_NAME=LARSEN(Dummy Name), Table_NAME=registration。在 Woklight Adapter.xml 中,其对应的 js 文件驻留在服务器上,客户端通过过程(回调函数)调用这些适配器。 Eclipse(Worklight) 提供了直接使用参数调用此方法的功能,结果显示在 html 文件中,因此可以最小化测试适配器的整个大故事。 【参考方案1】:

错误消息是说您的 SQL 语句无效,因此我推断您与数据库的连接正常。

要对此进行诊断,首先使用 DB2 命令行或其他工具运行 SQL。我猜你的意思是

  LARSEN.registration

而你说的是 DATABASE_NAME.registration

【讨论】:

是的,它的 LARSEN.registration;我直接运行了 Select 语句,并且在 Data Studio 控制台上遇到了同样的错误。仅尝试了所有可能的 Permo-Combo,例如 Schema:SELECT * FROM LARSEN.registration where LARSEN.registration.Mob_No = ? |仅数据库名称+架构:SELECT * FROM MOBILEDB.LARSEN.registration where MOBILEDB.LARSEN.registration.Mob_No = ? |仅限 DBNAME:SELECT * FROM MOBILEDB.registration where MOBILEDB.registration.Mob_No = ?直接表:SELECT * FROM registration where registration.Mob_No = ? 现在我们清楚了。这不是工作灯问题,而是 DB/SQL 问题。使用 db2 命令中心来构建您的查询。尝试最简单的查询: SELECT * FROM SCHEMA.TABLE - 在您的情况下,这应该是 SELECT * FROM LARSEN.registration - 但我想知道这是否区分大小写?因此我的建议 - 使用命令中心来构建查询。 是的,它与 DB2 有关。最后,我能够在 DB2 上使用 "SELECT * FROM LARSEN."registration" where LARSEN."registration"."Mob_No" = 9930667660;"但我被困在我的 JS 文件中。我尝试使用 var selectStatement = 'SELECT * FROM LARSEN."registration" where LARSEN."registration"."Mob_No" = ?';但作为回报,我得到与添加斜杠相同的错误“运行时:DB2 SQL 错误:SQLCODE=-204,SQLSTATE=42704,SQLERRMC=LARSEN.registration,DRIVER=3.58.82。\n执行查询:\nSELECT * FROM LARSEN。 \"registration\" where LARSEN.\"registration\".\"Mob_No\" = ?" 我将进一步研究。我们已经证明注册是小写的,因此我们似乎需要将它放在引号中。我在创建数据库时的做法是始终对所有表和列使用 UPPER_CASE。如果您对数据库有任何控制权,您可以尝试这样做,那么您将不需要引号。但是我认为你正在尝试的应该是可能的。我们即将提出一个新问题:如何为具有小写名称的表输入 Worklight 适配器数据库查询? 请尝试一件事:SELECT * FROM LARSEN.REGISTRATION 作为您的查询;如果可行,我们将处理 where 子句【参考方案2】:

得到了我自己的问题的答案,这是一个非常有趣的问题。感谢https://***.com/users/2260967/glen-misquith [Glen Misquith]

问题在于 SQL 查询框架,这与我对 MYSQL 所做的不同。

适配器的 Java 脚本文件:

var selectStatement4 = "UPDATE \"LARSEN\".\"registration\" SET \"LARSEN\".\"registration\".\"Pass\"=?, \"LARSEN\".\"registration\".\"Re_Pass\"=? WHERE \"User_Name\" = ?";
var procStmt5 = WL.Server.createSQLStatement(selectStatement4);

function updatePassword(username,pass,repass)

WL.Logger.debug("Inside updatePassword "+username+" "+pass+" "+repass);

return WL.Server.invokeSQLStatement(
        
            preparedStatement : procStmt5,
            parameters : [pass,repass,username]
        
);

这是一件很奇怪的事情,在准备 SQL 语句时需要在 SQL 语句中使用斜杠。 我真的很想了解 DB2 的这种行为。而且我也不能直接写'Select * from schema.table_name'并精确地写出需要从中获取数据的列名。

【讨论】:

以上是关于使用 Worklight 6.1.0 触发选择查询时出现 DB2 SQL 错误?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Worklight 6.1.0.2 时的问题

IBM Tealeaf 和 Worklight 6.1.0.01-2 Android 应用程序

如何手动将 Worklight 从 6.1.0.0 更新到 6.1.0.1(损坏的 IIM 安装)

基于 z/Linux 构建的 Worklight 6.1.0.1 ant - 编码问题?漏洞?

IBM Worklight 6.1.0.1,基于 2 个适配器的身份验证出现问题

Worklight 6.1:如何将 EULA 添加到混合应用程序