使用Worklight 6.1.0触发select查询时获取DB2 SQL错误?

使用Worklight 6.1.0触发select查询时获取DB2 SQL错误?,db2,ibm-mobilefirst,worklight-adapters,db2-connect,Db2,Ibm Mobilefirst,Worklight Adapters,Db2 Connect,我正在尝试使用worklight 6.1.0连接到本地LAN中的DB2,并触发Select查询以查找数据(如果存在)。但我得到了以下错误: { "errors": [ "Runtime: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DATABASE_NAME.REGISTRATION, DRIVER=3.58.82.\nPerformed query:\nSELECT * FROM DATABASE

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

{
       "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>
我做了一些关于将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数据的情况下得到的错误后,我觉得根据或用户表,“对象不存在”。任何建议都会有帮助。 注意:

  • 我的IP地址是172.21.11.125,从这里调用DB2适配器
  • DB2实例在172.21.11.129@50000上运行
  • 已经在server/lib中添加了db2jcc_license_cu_9.5.jar和db2jcc_9.5.jar。它的名字后面附加了“_9.5”,我已经从两个jar中删除了它,只保留了db2jcc_许可证_cu.jar和db2jcc.jar

  • 错误消息说您的SQL语句无效,因此我推断您与DB的连接正常

    要诊断此问题,请首先使用DB2命令行或其他工具运行SQL。我猜你是说

      LARSEN.registration
    

    而你说的是DATABASE_NAME.registration

    得到了我自己问题的答案,这真的很有趣。感谢[格伦·米斯奎斯]

    问题在于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\u name”并精确地写下需要从中提取数据的列名。

    数据库\u name真的是数据库/架构的名称吗?这似乎不是一个很清楚/有用的名字。db抱怨
    注册
    表不存在(或者无论如何都找不到),因此这可能不是用户表问题。我对Worklight了解不够-js是否分发给客户端?如果让客户机运行任意SQL语句,那么这样做似乎会导致灾难。这是一个明确的问题——我希望更多的人能够提供所遇到错误的全文,而不是他们尝试的步骤……我想,我确实犯了一点错误,让我澄清一下,数据库名称=MOBILEDB,模式名称=LARSEN(虚拟名称),表名称=注册。在这里,woklightadapter.xml及其对应的js文件驻留在服务器上,客户端通过过程(回调函数)调用这些适配器。Eclipse(Worklight)提供了使用参数直接调用此方法的功能,结果显示在html文件上,因此可以最小化测试适配器的整个大事件;我直接运行了Select语句,并且在DataStudio控制台上遇到了相同的错误。仅尝试了所有可能的Permo组合模式:从LARSEN.registration中选择*其中LARSEN.registration.Mob_No=?|仅DB名称+架构:从MOBILEDB.LARSEN.registration中选择*其中MOBILEDB.LARSEN.registration.Mob_No=?|仅DBNAME:从MOBILEDB.registration中选择*其中MOBILEDB.registration.Mob_No=?直接表:从registration中选择*,其中registration.Mob_No=?现在我们清楚了。这不是worklight问题,而是DB/SQL问题。使用db2命令中心构建查询。尝试最简单的查询:SELECT*FROM SCHEMA.TABLE-在您的示例中,这应该是SELECT*FROM LARSEN.registration-但我想知道这是否区分大小写?因此,我的建议是使用command Center构建查询。是的,它与DB2相关。最后,我能够在DB2上使用“SELECT*FROM LARSEN.”registration“where LARSEN.”registration“.”Mob_No“=9930667660;”运行相同的程序,但我仍然在JS文件中使用相同的框架。我尝试使用var selectStatement='SELECT*FROM LARSEN.“registration”where LARSEN.“registration”。“Mob_No”=;但作为回报,我得到了与斜杠相同的错误,斜杠添加了“Runtime:DB2 SQL error:SQLCODE=-204,SQLSTATE=42704,SQLERRMC=LARSEN.registration,DRIVER=3.58.82。\n执行的查询:\n从LARSEN选择*。“registration\”where LARSEN.“registration\”\“Mob\u No\”=?“我将进一步研究。我们已经证明了注册是小写的,因此我们似乎需要把它加上引号。我在创建数据库时的做法是对所有表和列始终使用大写字母。如果您对数据库有任何控制权,您可以尝试这样做,这样就不需要引用。但是我认为你所尝试的应该是可能的。我们即将需要一个新问题:如何为小写名称的表输入worklight adapter数据库查询?请尝试一件事:从LARSEN.REGISTRATION中选择*作为查询;如果行得通,我们将处理where条款
    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]
            }
    );
    }