проблемы с SELECT в FireBird
От: wild_ki-ll  
Дата: 20.03.07 09:56
Оценка:
FireBird 1.5
Проблема заключается вследующем:
пытаюсь выполнить следующий запрос — SELECT * FROM MyTable WHERE id = ?

char sql[1000];
ISC_STATUS status_vector[20];
isc_db_handle newdb;
isc_tr_handle trans;

strcpy(sql, "SELECT * FROM MyTable WHERE ID = ?");

isc_start_transaction(status_vector, &trans, 1, &newdb, 0, NULL);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "start_transaction");

isc_stmt_handle stmt1 = NULL;

isc_dsql_allocate_statement(status_vector, &newdb, &stmt1);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "ALLOCATE");

XSQLDA *sqlda_out;
sqlda_out = (XSQLDA *) malloc(XSQLDA_LENGTH(1));
sqlda_out->sqln = 1;
sqlda_out->version = SQLDA_VERSION1;

isc_dsql_prepare(status_vector, &trans, &stmt1, 0, sql, 3, NULL);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "PREPARE");


isc_dsql_describe_bind(status_vector, &stmt1, 3, sqlda_out);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "BIND");


if (sqlda_out->sqld > sqlda_out->sqln)
{
int n = sqlda_out->sqld;
free(sqlda_out);
sqlda_out = (XSQLDA *) malloc(XSQLDA_LENGTH(1));
sqlda_out->sqln = n;
sqlda_out->version = 1;
isc_dsql_describe_bind(status_vector, &stmt1, 3, sqlda_out);
}
short flag1 = 0;
ULONGLONG ID = 1;

sqlda_out->sqlvar[0].sqldata = (char*)&ID;
sqlda_out->sqlvar[0].sqltype = SQL_INT64 + 1;
sqlda_out->sqlvar[0].sqlind = &flag1;

XSQLDA *sqlda_in;
sqlda_in = (XSQLDA *) malloc(XSQLDA_LENGTH(46));

/*здесь идет определени и заполнение XSQLDA *sqlda_in */
...

isc_stmt_handle stmt = NULL;

isc_dsql_allocate_statement(status_vector, &newdb, &stmt);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "ALLOCATE");

isc_dsql_prepare(status_vector, &trans, &stmt, 0, sql, 3, sqlda_in);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "PREPARE");

char *cursor = "CURSOR";
isc_dsql_set_cursor_name(status_vector, &stmt, cursor, 0);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "SET CURSOR");

isc_dsql_execute(status_vector, &trans, &stmt, 3, NULL);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "EXECUTE");

isc_dsql_fetch(status_vector, &stmt, 3, sqlda_in);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "FETCH");

isc_rollback_transaction(status_vector, &trans);
if (status_vector[0] == 1 && status_vector[1])
pr_error(status_vector, "ROLLBACK");




так вот на isc_dsql_execute(status_vector, &trans, &stmt, 3, NULL);
выдает ошибку SQLDA missing or incorrect number/type of variables
Причем если в sql дать просто строку без '?', то всё работает.
Кто встречался с подобным подскажите где я не прав, пожалуйста.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.