Чтение онлайн

ЖАНРЫ

Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil

Востриков С М

Шрифт:

dpb_length,

dpb_buffer);

if (status_vector[0] == 1 && status_vector[1]){

isc_print_status(status_vector);

return(1};

}

if (db_handle){

isc_start_transaction(

status_vector,

&transaction_handle,

1,

&db_handle,

0,

NULL);

if (status_vector[0] == 1 && status_vector[1]){

isc_print_status(status_vector);

return(l);

}

}

Если были получены данные и они корректны, происходит вызов хранимой

процедуры:

if(ExecSP){

printf("<br><i>Attempt to call SP with the following

parameters:

' %s' , '%s' , ' %s' , '%s'</i>.....",form_b_index,form_b_name,form_b_a

uthor,form_b_theme);

Как можно видеть, принципиально инициализация структур для входящих параметров не сильно отличается от инициализации исходящих параметров из первого примера:

isqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(4));

isqlda->version = SQLDA_VERSION1;

isqlda->sqln = 4;

isqlda->sqld = 4;

isqlda->sqlvar[0] .sqldata = (char *)&form_b_index;

isqlda->sqlvar[0].sqltype = SQL_TEXT;

isqlda->sqlvar[0].sqllen = strlen(form_b_index);

isqlda->sqlvar [1] . sqldata = (char * ) &f orm_b_name,

isqlda->sqlvar[1].sqltype = SQL_TEXT;

isqlda->sqlvar[1].sqllen = strlen(form_b_name);

isqlda->sqlvar[2].sqldata = (char *)&form_b_author;

isqlda->sqlvar[2].sqltype = SQL_TEXT;

isqlda->sqlvar[2].sqllen = strlen(form_b_author);

isqlda->sqlvar[3].sqldata = (char *)&form_b_theme;

isqlda->sqlvar[3].sqltype = SQL_TEXT;

isqlda->sqlvar[3].sqllen = strlen(form_b_theme);

osqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(1));

osqlda -> version = SQLDA_VERSION1;

osqlda -> sqln = 1; osqlda -> sqld = 1;

osqlda->sqlvar[0].sqldata = (char *)&res_code;

osqlda->sqlvar[0].sqltype = SQL_LONG;

osqlda->sqlvar[0].sqllen = sizeof(long);

osqlda->sqlvar[0].sqlind = &o_ind[0];

Вызов ХП происходит сразу, без предварительной подготовки (подробнее об этом будет рассказано несколько ниже):

isc_dsql_exec_immed2(

status_vector,

&db_handle,

&transaction_handle,

0,

SPCall,

SQL_DIALECT_V6,

isqlda,

osqlda};

if (status_vector[0] == 1 && status_vector[1]){

isc_print_status(status_vector) ;

return(1);

}

if(res_code==0){

printf(" <t»successfly</b>.");

}

else{

printf(" <b>failed with result_code=%i</b>.",res_code);

}

free(isqlda);

free(osqlda);

}

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

printf ("<brxbr>&nbsp; &nbsp; &nbsp; Part 2: Select without input

parameters<br>");

osqlda = (XSQLDA *)malloc(XSQLDA_LENGTH(6));

osqlda -> version = SQLDA_VERSION1;

osqlda -> sqln = 6;

osqlda->sqlvar[0].sqldata = (char *)&b_id;

osqlda->sqlvar[0].sqltype = SQL_LONG;

osqlda->sqlvar[0].sqlind = &o_ind[0];

osqlda->sqlvar[1].sqldata = (char *)&b_index;

osqlda->sqlvar[1].sqltype = SQL_TEXT;

osqlda->sqlvar[1].sqlind = &o_ind[l];

osqlda->sqlvar[2].sqldata = (char *)&b_name;

osqlda->sqlvar[2].sqltype = SQLJVARYING;

osqlda->sqlvar[2].sqlind = &o_ind[2];

osqlda->sqlvar[3].sqldata = (char *)&b_author;

osqlda->sqlvar[3].sqltype = SQL_VARYING;

osqlda->sqlvar[3].sqlind = &o_ind[3];

osqlda->sqlvar[4].sqldata = (char *)&b_added;

osqlda->sqlvar[4].sqltype = SQL_TIMESTAMP;

osqlda->sqlvar[4].sqlind = &o_ind[4];

osqlda->sqlvar[5].sqldata = (char *)&b_theme;

osqlda->sqlvar[5].sqltype = SQL_VARYING;

osqlda->sqlvar[5].sqlind = &o_ind[5];

isc_dsql_allocate_statement(

status_vector,

&db_handle,

&statement_handle);

if (stacus_vector[0] == 1 && status_vector[1]){

isc_print_status(status_vector);

return{1);

}

isc_dsql_prepare(

status_vector,

&transaction_handle,

&statement_handle,

0,

query,

SQL_DIAL,ECT_Y6,

osqlda);

if (status_vector [ 0] == 1 && status_vector[1]) {

isc_print_status(status_vector) ;

return(1);

}

Заметьте,

что если бы запрос гарантированно возвращал одну запись, то надобность в вызове функции isc_dsql_fetchoтпaлa бы, а на месте последних двух пустых значений в вызове нижеследующей функции были бы соответственно isqlda и osqlda:

isc_dsql__execute2 (

status_vector,

&transaction_handle,

&statement_handle,

1,

NULL,

NULL);

if (status_vector[0] == 1 && status_vector[1]){

isc_print_status (status_vector);

return(1);

}

while((fetch_code = isc_dsql_fetch(

status_vector,

&staternent .handle,

1,

osqlda))==0)

{

Вот здесь и производится проверка на существование хотя бы одной записи в таблице:

if (!hDisplayed){

hDisplayed=l;

printf ("<brxbr><center><table border=0 bgcolor=black

cellpadding=l cellspacing=l><tr align=center bgcolor=#999999>

<td>Book ID</tr> <td>CODE</tr> <td>TITLE</tr> <td>AUTHOR</tr>

Поделиться с друзьями: