powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQL0444N rc 99 - при обращении к польз.функции С++
25 сообщений из 25, страница 1 из 1
SQL0444N rc 99 - при обращении к польз.функции С++
    #38144487
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перенес БД с DB2 v8 x86 на DB2 Express-C 9.7 x64... Отказываются работать пользовательские функции...
Возвращает SQL0444N rc 99... Что может быть? Функции в свое время компилировались еще VS 6... Может быть дело в древности?
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38144707
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2013-02-09-22.52.01.045000+240 E13534F548 LEVEL: Error (OS)
PID : 1800 TID : 2676 PROC : db2syscs.exe
INSTANCE: DB2 NODE : 000 DB : DATA1
APPHDL : 0-7 APPID: *LOCAL.DB2.130209185141
AUTHID : ADMIN
EDUID : 2676 EDUNAME: db2agent (DATA1)
FUNCTION: DB2 UDB, oper system services, sqloloadmodule, probe:43
MESSAGE : ZRC=0x830000C1=-2097151807
CALLED : OS, -, unspecified_system_function
OSERR : 193 "%1 не является приложением Win32."

Вот такое в db2diag.log пишется...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145583
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Установил VS2005....
2. Установил Express-C 9.7...
3. Взял исходники и собрал dll заново....

Подключил функцию... Результат тот же.... OS ERR 193.....

Ну ткните же носом где я туплю... Ведь чую тут какой-то мой косяк очевидный...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145594
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
стандартный батником BLDRTN через командную строку собирать модуль отказывается...
ругается на LNK2001 __DllMainCRTStartup@12
....
Взял cxx-файл, который получился после embprep.bat... И собрал по нему dll прямо в среде VS2005... Результат тот же...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145686
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Итак... В среде VS 2005 dll собирается...
подключаю ее к базе...
при вызове функции получаю SQL0444N rc 99....

Мысли закончились...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145703
TORT,

DLL точно получается 32-битный?
Опции компиляции совпадают?
Windows C and C++ routine compile and link options

Нужно попробовать скомпилировать (при помощи bldrtn) и запустить любую функцию из примеров.
Если будет работать - сравнить исходный код примера и собственный код.
Если нет - разбираться с процессом компиляции.

Возможно, имеет смысл использовать более свежий Visual Studio for C++.
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145715
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему dll должна быть 32-битная?
У меня и Win7 x64, и Express-C 9.7 x64....

Дело в dll-ке... Если ее удалить, то получаю стандартный код SQL0444N rc 4

Насчет примеров... Сейчас попробую...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145729
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В опции компилятора cl.exe указано -DWIN32... Это нормально для моего случая?
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145747
TORT,

Попробуйте раскомментировать следующую строку (37) в bldrtn

rem set BITWIDTH=32onWin64

Полностью блок строк должен выглядеть так:
Код: powershell
1.
2.
3.
rem Uncomment the next line if building 32-bit applications using
rem a DB2 64-bit product on Windows 64-bit
set BITWIDTH=32onWin64



Это влияет на определение путей к библиотекам, должно вылечить ошибку линковки.
Вот условный блок
Код: powershell
1.
if "%BITWIDTH%" == "32onWin64" set LIB=%DB2PATH%\lib\Win32;%LIB%
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145765
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за наводки... Есть хорошая новость... Пример собрался и заработал... Уже хлеб...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38145797
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все... разобрался... дело было в PROGRAM TYPE SUB при создании функции... По умолчанию, похоже, ставится PROGRAM TYPE MAIN и СУБД ищет исполняемый файл, а не библиотеку DLL...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38158519
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошло несколько дней... Попытался вновь пересоздать функцию... Устанавливаю PROGRAM TYPE SUB, а функция опять за старое... SQL0444N RC=99
Что же это может быть все-таки?
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38160261
TORT,

Если функция из примеров нормально компилируется и работает, и процесс компиляции кода из примера и кода проблемной функции 100% совпадает, то искать отличия в самом коде.
Если анализ db2diag.log ничего нового не принес, то по порядку:
1. С помощью Dependency Walker проверить список внешних DLL, на которые есть ссылки из модуля функции. Там есть опция (кнопка) показывать полные пути.
Сравнить список зависимостей для примера и для проблемного кода.
Если функция использует внешние библиотеки, то убедиться что для них совпадает режим битности.

2. При помощи Sysinternals Process Monitor или File Monitor выяснить какие DLL-модули и откуда пытается подгрузить DB2 при вызове функции.
Там нужно правильно задать фильтр, например по номеру процесса, т.к. по умолчанию мониторится все, а это весьма плотный поток информации.
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38185954
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы не плодить тем тут напишу... Продолжение истории...
Вчера ловил глюк... Вызываю свою функцию (ту, которую выше в теме подключал)... До какого-то времени все работало нормально...
Вчера пробую вызов values(myfunc(...)) выдает неправильное значение... Ну просто от фонаря, но стабильно неправильное...
Причем... Если функцию вызывать локально, то все корректно... Если через клиента, то неправильное...
Далее ньюанс... Если пробую вызов в связке v9.7 x64 Exc-C - v9.7 x64 Exc-C, то все корректно... А если клиент v8.1.9 x32, а сервер v9.7 x64 Exc-C , тогда не корректное значение.... Все вылечилось перезагрузкой сервера...
Что это могло быть? Что-то с совместимостью?
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38186059
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция зарегистрирована как FENCED и NOT THREADSAFE....
Если вызвать ее сначала с x32 клиента, то работает... Если вызвать ее с x64 клиента, то на x32 клиентах перестает работать адекватно... Очень на это похоже... Может же такое быть?
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38186648
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Взял пример... Собрал udfsrv.dll... Подключил функции, результат все тот же... rc99....
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38186676
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Краткая выжимка....

Есть Win7 x64....
Есть DB2 Express-C v 9.7 x64

Есть VS2005 x86....

Примеры udfsrv.c собираю в dll... Создаю функцию... Потом пытаюсь запустить values(myfunc()) и получаю SQL0444N Reason Code 99

Все... Куда копать?
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38186743
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что же за взрыв мозга....?!?!
Истроия 1:
1. Рестарт сервера DB2 x64...
2. Клиент DB2 x32 (на Win7 x64 или WinXP x32 без разницы) вызывает myfunc... Результат правильный...
3. Клиент DB2 x64 (на Win7 x64) вызывает myfunc... Результат правильный...
4. Клиент DB2 x32 (на Win7 x64 или WinXP x32 без разницы) вызывает myfunc... Результат НЕ правильный...
5. Клиент DB2 x64 (на Win7 x64) вызывает myfunc... Результат правильный...

Истроия 2:
1. Рестарт сервера DB2 x64...
2. Клиент DB2 x64 (на Win7 x64) вызывает myfunc... Результат правильный...
3. Клиент DB2 x32 (на Win7 x64 или WinXP x32 без разницы) вызывает myfunc... Результат НЕ правильный...
4. Клиент DB2 x64 (на Win7 x64) вызывает myfunc... Результат правильный...

Что за треш? Получается, что DB2 x32 клиенты не могут работать с DB2 x64 клиентами?
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38187192
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму... Как же такое в принципе возможно?!?!
Функция возвращает разные результаты в зависимости от разрядности клиента и ОС клиента... Разве это должно быть?
Переставил сервер... Теперь он DB2 Express-C 9.7.6 x32 на Win7 x64... Проблема немного видоизменилась... Теперь башню серверу сносит вызов функции с 32-разрядного клиента на Win7 x64 машине....
Пошлите, где копать-то? Как же функция может возвращать разные результаты??? Функция DETERMINISTIC, входные параметры идентичны...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38187594
TORT,

Тут нужна конкретика.
Нужно как минимум DDL-определение функции и хотя бы часть исходного кода, в котором описан заголовок функции.

Если возвращаются разные результаты в разных режимах, нужно в код функции ставить диагностический вывод в файл, чтобы фиксировать что пришло на вход и что вернулось на выход. Нужно понять, в каком месте происходит искажение информации. Либо это происходит в теле функции, тогда вопрос к отладке этого кода, либо это происходит на этапе передачи между DB2 и кодом функции, и с этим нужно разбираться отдельно.
Возможно также, что искажение информации происходит на этапе взаимодействия клиент/сервер.

Отдельный вопрос насколько сложная логика заложена в функцию? Не проще ли будет переписать ее на NativeSQL и забыть про компиляцию вообще?
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38187630
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ХабаровTORT,

Тут нужна конкретика.
Нужно как минимум DDL-определение функции и хотя бы часть исходного кода, в котором описан заголовок функции.

Если возвращаются разные результаты в разных режимах, нужно в код функции ставить диагностический вывод в файл, чтобы фиксировать что пришло на вход и что вернулось на выход. Нужно понять, в каком месте происходит искажение информации. Либо это происходит в теле функции, тогда вопрос к отладке этого кода, либо это происходит на этапе передачи между DB2 и кодом функции, и с этим нужно разбираться отдельно.
Возможно также, что искажение информации происходит на этапе взаимодействия клиент/сервер.

Отдельный вопрос насколько сложная логика заложена в функцию? Не проще ли будет переписать ее на NativeSQL и забыть про компиляцию вообще?

Конкретика... Функция считает crc32 для входной строки... Написана на С... Алгоритм расчета, да и сами исходники идентичны вот этим http://www.sql.ru/forum/actualthread.aspx?tid=854674 ....
ddl функции...

CREATE FUNCTION "DBASE"."CRC32"
(
STR VARCHAR(100),
L INTEGER
)

RETURNS BIGINT
SPECIFIC CRC32
EXTERNAL NAME 'c:\database\crc32!crc32'
LANGUAGE C
PARAMETER STYLE SQL
VARIANT
FENCED NOT THREADSAFE
NULL CALL
READS SQL DATA
EXTERNAL ACTION
NO SCRATCHPAD
NO FINAL CALL
DISALLOW PARALLEL
NO DBINFO;

За идею с логами отдельное спасибо... Попробую реализовать...
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38188002
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TORT,

Есть db2 ese 9.7.6 x64.
Пробовал по-разному и с windows x64, и с x86 (10.1 linux, 9.7 windows) в разных комбинациях.
Не смог добиться разных результатов.

Алгоритм взял отсюда: Cyclic redundancy check
crc32.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
#include <stdlib.h>
#include <string.h>
#include <sqlcli.h>
#include <sqludf.h>

/*
CREATE FUNCTION CRC32(STR VARCHAR(4000))
RETURNS BIGINT
SPECIFIC CRC32
EXTERNAL NAME 'crc32!crc32'
LANGUAGE C
PARAMETER STYLE SQL
FENCED THREADSAFE
DETERMINISTIC
NOT NULL CALL
NO SQL
NO EXTERNAL ACTION
ALLOW PARALLEL;
*/

void make_crc_table(
  SQLUINTEGER crc_table[]
) {
  int i, j;
  for (i = 0; i < 256; i++) {
    SQLUINTEGER c = i;
    for (j = 0; j < 8; j++)
      c = (c & 1) ? (0xEDB88320 ^ (c >> 1)) : (c >> 1);
    crc_table[i] = c;
  }
}
 
SQLUINTEGER get_crc32(
  SQLUDF_VARCHAR *buf
, int len
, SQLUINTEGER crc_table[256]
) {
  int i;
  SQLUINTEGER c = 0xFFFFFFFF;

  for (i = 0; i < len; i++)
    c = crc_table[(c ^ buf[i]) & 0xFF] ^ (c >> 8);
  return c ^ 0xFFFFFFFF;
}

#ifdef __cplusplus
extern "C"
#endif
void SQL_API_FN crc32( 
  SQLUDF_VARCHAR    *inStr
, SQLUDF_BIGINT     *outRes
, SQLUDF_NULLIND    *inStrNullInd
, SQLUDF_NULLIND    *outResNullInd
, SQLUDF_TRAIL_ARGS
) {
  SQLUINTEGER crc_table[256];

  if ((*outResNullInd = *inStrNullInd) == -1) return;
  make_crc_table(crc_table);
  *outRes = get_crc32(inStr, strlen(inStr), crc_table);
}


bldrtn.bat
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
@echo off
setlocal
@CALL "C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars64.bat" 
set INCLUDE=%DB2PATH%\include;%INCLUDE%
rem Microsoft C/C++ Compiler
set BLDCOMP=cl

if "%BITWIDTH%" == "32onWin64" set LIB=%DB2PATH%\lib\Win32;%LIB%
if "%1" == "" goto error

if exist "%1.cpp" goto cpp
%BLDCOMP% -Zi -Od -c -W2 -DWIN32 -MD -D_CRT_SECURE_NO_DEPRECATE %1.c
goto link_step
:cpp
%BLDCOMP% -Zi -Od -c -W2 -DWIN32 -MD -D_CRT_SECURE_NO_DEPRECATE /EHsc %1.cpp

rem Link the program.
:link_step
set BUFFEROVERFLOWLIB=
if "%CPU%" == "AMD64" set BUFFEROVERFLOWLIB=bufferoverflowU.lib
link -debug -dll -out:%1.dll %1.obj db2api.lib %BUFFEROVERFLOWLIB% -def:%1.def
if EXIST %1.dll.manifest MT -manifest %1.dll.manifest -outputresource:%1.dll;#2

rem Copy the stored procedure DLL to the 'function' directory
copy %1.dll "%DB2PATH%\function"

goto exit
:error
echo Usage: bldrtn prog_name
:exit

endlocal
@echo on
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38188396
TORT,

Вношу свой вариант.

1. Согласно документации, если DB2 сервер работает в 64-битном режиме, то и функцию желательно компилировать в режиме 64-бит. Так будет работать быстрее.
2. Сам алгоритм CRC32 работает по таблице. Генерировать таблицу при каждом вызове функции не есть правильно, т.к. ее можно просчитать заранее. Поэтому взят код с готовой таблицей, размещенный в википедии Циклический избыточный код , а именно: "Пример программы табличного (быстрого) расчёта CRC-32 на языке Си".

В код добавлено описание функции в виде, совместимом с СУБД DB2.

Код скомпилирован на рабочей станции следующей конфигурации:
Операционная система: Windows 7 Professional x64
DB2: Client V9.7 FP7 (x64)
Компилятор: Microsoft (R) C/C++ Optimizing Compiler Version 16.00.30319.01 for x64
Целевая платформа: /Release /x64 /2003

Компилятор установлен в комплекте с Microsoft Windows SDK for Windows 7 and .NET Framework 4 (ISO) .
Взят дистрибутив для платформы x64: GRMSDKX_EN_DVD.iso

Компилировал с помощью команды "udf_compile.cmd crc32"
В итоге получил dll, скопировал на сервер (Windows 2003 Server SP2 (x64), DB2 V10.1 FP2 (x64)) в подкаталог FUNCTION
После этого создал в базе описание функции (cre_CRC32.ddl). Проблем с работой пока не обнаружил. Запрашивал с разных клиентов. Выкладываю архив, включая готовую DLL-библиотеку.Надеюсь поможет разобраться.
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38188954
TORT,

Еще вопрос, для каких целей используется эта функция?
Для создания уникальных хешей можно использовать и другие алгоритмы, например MD5.

PS: В DB2 9.7 есть встроенная функция хеширования, правда сам пока ее нигде не применял.
Правда эта функция, как и другие из раздела System-defined Modules, недоступна на DB2 Express-C.
GET_HASH_VALUE function - Compute a hash value for a given string .
...
Рейтинг: 0 / 0
SQL0444N rc 99 - при обращении к польз.функции С++
    #38190269
TORT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Евгений ХабаровTORT,

Еще вопрос, для каких целей используется эта функция?
Для создания уникальных хешей можно использовать и другие алгоритмы, например MD5.

PS: В DB2 9.7 есть встроенная функция хеширования, правда сам пока ее нигде не применял.
Правда эта функция, как и другие из раздела System-defined Modules, недоступна на DB2 Express-C.
GET_HASH_VALUE function - Compute a hash value for a given string .

Спасибо, что отвечаете... И Вам, и Mark Barinstein ....

С другими алгоритмами хеширования пока не хочется заморачиваться... Мне в принципе непонятно было отчего функция возвращала разные результаты... Ведь на WSE v.8 работает без проблем...
Потестирую Ваши примеры... Напишу, в чем там я заблуждался... Кстати, с правами доступа в Win7 не может быть каких-нибудь бедствий?
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / SQL0444N rc 99 - при обращении к польз.функции С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]