Получение ошибки SQL DB2 при запуске запроса на выборку с помощью Worklight 6.1.0?

Я пытаюсь подключиться к DB2 в своей локальной сети, используя worklight 6.1.0 и запуская запрос выбора для поиска данных, если они существуют. Но я получаю ошибку ниже:

{
       "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 или пользовательская таблица не существует. Любое предложение будет полезно. ПРИМЕЧАНИЕ:

  1. Мой IP-адрес — 172.21.11.125, откуда я вызываю адаптер для DB2.
  2. Экземпляр DB2 работает по адресу 172.21.11.129 @ 50000.
  3. db2jcc_license_cu_9.5.jar и db2jcc_9.5.jar уже добавлены в server/lib. К его имени добавлено «_9.5», которое я удалил из обоих jar-файлов и оставил только db2jcc_license_cu.jar и db2jcc.jar.

person Pawankumar Dubey    schedule 22.07.2014    source источник
comment
Действительно ли DATABASE_NAME является именем вашей базы данных/схемы? Это не похоже на очень понятное/полезное имя. БД жалуется, что таблица registration не существует (или в любом случае не может ее найти), так что, вероятно, это не проблема пользовательской таблицы. Я недостаточно знаю о Worklight — распространяется ли js среди клиентов? Это может привести к катастрофе, если вы позволите клиентам выполнять произвольные операторы SQL. В противном случае это четко заданный вопрос - я бы хотел, чтобы больше людей предоставили полный текст обнаруженной ошибки, а тем более шаги, которые они пытались...   -  person Clockwork-Muse    schedule 22.07.2014
comment
Я думаю, что немного ошибся с вопросом, позвольте мне уточнить, что Database_Name=MOBILEDB, SCHEMA_NAME=LARSEN(фиктивное имя), Table_NAME=registration. Здесь в Woklight Adapter.xml и соответствующем ему файле js находится на сервере, и клиент вызывает этот адаптер через процедуру (функция обратного вызова). Ну, Eclipse (Worklight) предоставляет функцию прямого вызова этих методов с параметром, и результат отображается в html-файле, поэтому вся большая история для тестирования адаптеров может быть сведена к минимуму.   -  person Pawankumar Dubey    schedule 22.07.2014


Ответы (2)


В сообщении об ошибке говорится, что ваш оператор SQL недействителен, и поэтому я делаю вывод, что ваше соединение с БД в порядке.

Чтобы диагностировать это, сначала запустите SQL с помощью командной строки DB2 или других инструментов. Я думаю, ты имеешь в виду

  LARSEN.registration

тогда как вы говорите DATABASE_NAME.registration

person djna    schedule 22.07.2014
comment
Да, это LARSEN.registration; Я напрямую запустил оператор Select и ту же ошибку, что и на консоли Data Studio. Перепробовал все возможные Permo-Combo, например только схему: SELECT * FROM LARSEN.registration где LARSEN.registration.Mob_No = ? | Только имя БД+схема: SELECT * FROM MOBILEDB.LARSEN.registration где MOBILEDB.LARSEN.registration.Mob_No = ? | Только DBNAME: SELECT * FROM MOBILEDB.registration где MOBILEDB.registration.Mob_No = ? Прямая таблица: SELECT * FROM Registration где Registration.Mob_No = ? - person Pawankumar Dubey; 22.07.2014
comment
Итак, теперь мы ясно. Это не проблема рабочего освещения, это проблема DB/SQL. Используйте командный центр db2 для построения запроса. Попробуйте самый простой запрос: SELECT * FROM SCHEMA.TABLE — в вашем случае это должно быть SELECT * FROM LARSEN.registration — но интересно, чувствителен ли он к регистру? Отсюда мое предложение - использовать командный центр для построения запроса. - person djna; 22.07.2014
comment
Да, это связано с DB2. Наконец, я смог запустить то же самое на DB2, используя SELECT * FROM LARSEN.registration, где LARSEN.registration.Mob_No = 9930667660; но я застрял в создании того же самого в моем файле JS. Я пробовал с var selectStatement = 'SELECT * FROM LARSEN.registration, где LARSEN.registration.Mob_No = ?'; но в ответ я получаю ту же ошибку с добавленными косыми чертами. Время выполнения: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=LARSEN.registration, DRIVER=3.58.82.\nВыполнен запрос:\nSELECT * FROM LARSEN.\ регистрация\ где ЛАРСЕН.\регистрация\.\Mob_No\ = ? - person Pawankumar Dubey; 22.07.2014
comment
Я собираюсь исследовать дальше. Мы показали, что регистрация пишется в нижнем регистре, и поэтому кажется, что нам нужно поместить ее в кавычки. Моя практика при создании баз данных заключается в том, чтобы всегда использовать UPPER_CASE для всех таблиц и столбцов. Если у вас есть какой-либо контроль над БД, вы можете попробовать это, тогда вам не понадобятся кавычки. Однако я думаю, что то, что вы пытаетесь, должно быть возможно. Мы приближаемся к необходимости задать новый вопрос: как вводить запросы к базе данных адаптера Worklight для таблиц с именами в нижнем регистре? - person djna; 22.07.2014
comment
Пожалуйста, попробуйте одну вещь: SELECT * FROM LARSEN.REGISTRATION в качестве запроса; мы разберемся с предложением where, если это сработает - person djna; 22.07.2014

Получил ответ на свой вопрос, и это действительно интересно. Благодаря https://stackoverflow.com/users/2260967/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 при его подготовке. Мне бы очень хотелось понять такое поведение DB2. А также я не могу напрямую написать «Select * from schema.table_name» и точно написать имя столбца, из которого необходимо получить данные.

person Pawankumar Dubey    schedule 24.07.2014