Re[9]: interbase в Linux
От: Alex.Che  
Дата: 04.12.06 10:10
Оценка:
Привет, Hiden!
Вы пишешь 04 декабря 2006:

H> а если еще не писать exit !!. то будет следующая ошибка

H> Expected end of statement, encountered EOF
H> так как я создаю БД и ХП из makefile при помощи вызова isql, а exit !!
H> прекращает вызов isql

Убери !! после первого END-а

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[8]: interbase в Linux
От: Hiden  
Дата: 04.12.06 10:24
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, Alex.Che, Вы писали:

AC>>isc_dsql_execute2 универсальнее, гибче и удобнее.
T>Ну я как бы с этим не спорю.
T>Просто привёл список доступных функций для решения его проблемы.
T>Ну а уж выбирать всяко ему.

Попробывал использовать isc_dsql_execute2, но результат тот же:
message length error (encountered 0, expected 32)
Re[9]: interbase в Linux
От: Alex.Che  
Дата: 04.12.06 10:35
Оценка:
Привет, Hiden!
Вы пишешь 04 декабря 2006:

H> Попробывал использовать isc_dsql_execute2, но результат тот же:

H> message length error (encountered 0, expected 32)

Да не в бобине у тебя дело. (С)
Похоже, у тебя сервер и клент разных версий.
Ищи "лишние" gds32.dll
У "нелишних" сверяй версии.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[10]: interbase в Linux
От: Hiden  
Дата: 04.12.06 10:51
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Привет, Hiden!

AC>Вы пишешь 04 декабря 2006:

H>> Попробывал использовать isc_dsql_execute2, но результат тот же:

H>> message length error (encountered 0, expected 32)

AC>Да не в бобине у тебя дело. (С)

AC>Похоже, у тебя сервер и клент разных версий.
AC>Ищи "лишние" gds32.dll
AC>У "нелишних" сверяй версии.

AC>--

AC>With best regards, Alex Cherednichenko.

А в Linux эта библиотека как называется? если так же (gds32.so) то где ее искать, а то что то поиск не может найти
Re[11]: interbase в Linux
От: Alex.Che  
Дата: 04.12.06 11:03
Оценка:
Привет, Hiden!
Вы пишешь 04 декабря 2006:

AC>> Да не в бобине у тебя дело. (С)

AC>> Похоже, у тебя сервер и клент разных версий.
AC>> Ищи "лишние" gds32.dll
AC>> У "нелишних" сверяй версии.

H> А в Linux эта библиотека как называется?


libgds.so — для InterBase, либо же libfbclient.so — для Firebird.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[12]: interbase в Linux
От: Hiden  
Дата: 04.12.06 12:13
Оценка:
Здравствуйте, Alex.Che, Вы писали:

AC>Привет, Hiden!

AC>Вы пишешь 04 декабря 2006:

AC>>> Да не в бобине у тебя дело. (С)

AC>>> Похоже, у тебя сервер и клент разных версий.
AC>>> Ищи "лишние" gds32.dll
AC>>> У "нелишних" сверяй версии.

H>> А в Linux эта библиотека как называется?


AC>libgds.so — для InterBase, либо же libfbclient.so — для Firebird.


AC>--

AC>With best regards, Alex Cherednichenko.

Я нашел четыре библиотеки в home/user/ibc/libgds.so, lib/libgds.so, opt/interbase.prev.lnk/lib/libgds.so, usr/lib/libgds.so
Что теперь с ними делать? Как посмотреть в линуксе их версии и как я понимаю лишние надо удалить или заменить, а какие будут лишние???
Re[13]: interbase в Linux
От: Alex.Che  
Дата: 04.12.06 12:55
Оценка:
Привет, Hiden!
Вы пишешь 04 декабря 2006:

H> Я нашел четыре библиотеки в home/user/ibc/libgds.so, lib/libgds.so, opt/interbase.prev.lnk/lib/libgds.so, usr/lib/libgds.so

H> Что теперь с ними делать? Как посмотреть в линуксе их версии.

Тут я помочь не смогу. Я виндузятник, не юниксолог.

--
With best regards, Alex Cherednichenko.
Posted via RSDN NNTP Server 2.0
Re[13]: interbase в Linux
От: Sheridan Россия  
Дата: 04.12.06 13:46
Оценка:
Здравствуйте, Hiden, Вы писали:

H>Я нашел четыре библиотеки в home/user/ibc/libgds.so, lib/libgds.so, opt/interbase.prev.lnk/lib/libgds.so, usr/lib/libgds.so

H>Что теперь с ними делать? Как посмотреть в линуксе их версии и как я понимаю лишние надо удалить или заменить, а какие будут лишние???

1. Откуда запускается сервак?
2. То что ты нашел — файлы или линки на файлы?

Навскидку — скорее всего оно у тебя хватает либо home/user/ibc/libgds.so, либо lib/libgds.so, но скорее всего второе.
Если сумееш натравить strace на запуск сервака БД — увидиш точно.

[RSDN@Home][1.2.0][alpha][668]
[В доме без жильцов — известных насекомых не обрящешь. [К. Прутков]]
Matrix has you...
Re[9]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 05.12.06 08:04
Оценка:
Здравствуйте, Hiden, Вы писали:
H>Попробывал использовать isc_dsql_execute2, но результат тот же:
H>message length error (encountered 0, expected 32)
Покажи код.
Ты точно задал куды выходные параметры покласть?
Соощение точно при вызове isc_dsql_execute2 вылетает?
Re[10]: interbase в Linux
От: Hiden  
Дата: 05.12.06 09:03
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, Hiden, Вы писали:

H>>Попробывал использовать isc_dsql_execute2, но результат тот же:
H>>message length error (encountered 0, expected 32)
T>Покажи код.
T>Ты точно задал куды выходные параметры покласть?
T>Соощение точно при вызове isc_dsql_execute2 вылетает?

check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, sqlda));
short i0 = 0, i1 = 0;
sqlda->sqlvar[0].sqldata = (char *) &id;
sqlda->sqlvar[0].sqltype = SQL_TEXT;
sqlda->sqlvar[0].sqlind = &i0;

sqlda->sqlvar[1].sqldata = (char *) &name;
sqlda->sqlvar[1].sqltype = SQL_TEXT;
sqlda->sqlvar[1].sqlind = &i1;

check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, sqlda, NULL));

ISC_STATUS fetch_stat;

while ((fetch_stat = isc_dsql_fetch(status_vector, &stmt, 1, sqlda)) == 0)
{

id[9] = '\0';
name[49] = '\0';
printf("\nid: %s", id);
printf("\nname: %s\n", name);
}
....
если в str1 записывать select то все работает и в id и name записываются данные, а если там указать execute то возникает такая ошибка
может действительно все дело в несовпадении версий клиента и сервера
Re[11]: interbase в Linux
От: Tonal- Россия www.promsoft.ru
Дата: 05.12.06 10:38
Оценка:
Здравствуйте, Hiden, Вы писали:

H>check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, sqlda));
H>short i0 = 0, i1 = 0;
H>sqlda->sqlvar[0].sqldata = (char *) &id;
H>sqlda->sqlvar[0].sqltype = SQL_TEXT;
H>sqlda->sqlvar[0].sqlind = &i0;

H>sqlda->sqlvar[1].sqldata = (char *) &name;
H>sqlda->sqlvar[1].sqltype = SQL_TEXT;
H>sqlda->sqlvar[1].sqlind = &i1;

H>check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, sqlda, NULL));

У тебя нет входных параметров. Есть только выходные. Стало быть надо поменять местами 2 последних параметра, т.е:
check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, NULL, sqlda));


P.S. Открой доку по функции isc_dsql_execute2 и внимательно вчитайся в эти величественные строки:

XSQLDA* in_xsqlda
Pointer to an optional, previously allocated XSQLDA used for input;
if input parameters are not supplied, set this value to NULL

XSQLDA* out_xsqlda
Pointer to an optional, previously allocated XSQLDA used for results of statement execution;
if not required, set this value to NULL

Re[12]: interbase в Linux
От: Hiden  
Дата: 05.12.06 14:34
Оценка:
Здравствуйте, Tonal-, Вы писали:

T>Здравствуйте, Hiden, Вы писали:


T>
H>>check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, sqlda));
H>>short i0 = 0, i1 = 0;
H>>sqlda->sqlvar[0].sqldata = (char *) &id;
H>>sqlda->sqlvar[0].sqltype = SQL_TEXT;
H>>sqlda->sqlvar[0].sqlind = &i0;

H>>sqlda->sqlvar[1].sqldata = (char *) &name;
H>>sqlda->sqlvar[1].sqltype = SQL_TEXT;
H>>sqlda->sqlvar[1].sqlind = &i1;

H>>check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, sqlda, NULL));
T>

T>У тебя нет входных параметров. Есть только выходные. Стало быть надо поменять местами 2 последних параметра, т.е:
T>
T>check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, NULL, sqlda));
T>


T>P.S. Открой доку по функции isc_dsql_execute2 и внимательно вчитайся в эти величественные строки:


T>

T>XSQLDA* in_xsqlda
T>Pointer to an optional, previously allocated XSQLDA used for input;
T>if input parameters are not supplied, set this value to NULL
T>

T>XSQLDA* out_xsqlda
T>Pointer to an optional, previously allocated XSQLDA used for results of statement execution;
T>if not required, set this value to NULL


Сделал как Вы сказали, немного изменил код:
...
int emp_no = 3;
char str1[BUFLEN];
isc_tr_handle trans = NULL;
long status[50];
sprintf(str1, "execute procedure sp %d;",emp_no);

check( isc_start_transaction(status_vector, &trans,1, &db, 0, 0) );
isc_stmt_handle stmt = NULL;

static char id[10], name[50];

check( isc_dsql_allocate_statement(status_vector, &db, &stmt));

XSQLDA *sqlda;
XSQLVAR *var;
sqlda = (XSQLDA*) malloc(XSQLDA_LENGTH(2));
sqlda->sqln = 2;
sqlda->sqld = 2;
sqlda->version = 1;

check( isc_dsql_prepare(status_vector, &trans, &stmt, 0, str1, 1, NULL));
check( isc_dsql_describe(status_vector, &stmt, 1, sqlda));
int i;
for(i=0,var=(sqlda->sqlvar);i<(sqlda->sqld);i++,var++)
{
int dtype=(var->sqltype & ~1);
switch(dtype)
{
case SQL_VARYING:
var->sqltype = SQL_TEXT;
var->sqldata = (char*)malloc(sizeof(char)*var->sqllen + 2);
break;
case SQL_TEXT:
var->sqldata = (char*)malloc(sizeof(char)*var->sqllen);
break;
case SQL_LONG:
var->sqldata = (char*)malloc(sizeof(long));
break;
default:
break;
}
if(var->sqltype & 1)
{
var->sqlind = (short*)malloc(sizeof(short));
}
}

check( isc_dsql_execute2(status_vector, &trans, &stmt, 1, NULL, sqlda));

ISC_STATUS fetch_stat;

while ((fetch_stat = isc_dsql_fetch(status_vector, &stmt, 1, sqlda)) == 0)
{
id[9] = '\0';
name[49] = '\0';
printf("\nid: %s", id);
printf("\nname: %s\n", name);
}
check( isc_dsql_free_statement(status_vector, &stmt, DSQL_drop));

check( isc_commit_transaction(status_vector, &trans) );
...
в хранимой процедуре у меня выходные параметры типа integer и varchar(20)

Ни как не могу понять, что теперь не так, теперь выдает такую ошибку
Dynamic SQL Error
-SQL error code =-804
-Incorrect values within SQLDA structure
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.