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...
Пока на собственное сообщение не было ответов, его можно удалить.