Как прочитать размер результата запроса баз данных firebird?

#c #malloc #firebird

#c #malloc #firebird

Вопрос:

Я делаю интерфейс C с базами данных firebird. Я выполнил несколько операций с запросами. Я хотел бы знать, как прочитать размер результата?

Ниже приведен код. Я создал и вставил некоторые значения в таблицу.Я хотел бы прочитать размер результата.

 #include <stdio.h>
#include "/Library/Frameworks/Firebird.framework/Versions/A/Headers/ibase.h"

static char *createTable="CREATE TABLE newex (Id int)"; //query for creating data table
static char *Insertvalues="INSERT INTO newex values (1)";//doing insertion into the   

//above created table

int SQLOpen(void)
{
    ISC_STATUS          status_vector[20];
    isc_tr_handle       transactionHandle = NULL; //transaction handle
    isc_db_handle       database = SQLGetDatabase();//database handle
    char                logInData [256], *dpb, *p;
    short               bufferLength;
    User_Credentials    credentials;

    sprintf(logInData, "%c%c%c%c%c%c%s%c%c%s",      isc_dpb_version1,
                                                    isc_dpb_num_buffers,
                                                    1,
                                                    90,
                                                    isc_dpb_user_name,
                                                    strlen("SYSDBA"),
                                                    "SYSDBA",
                                                    isc_dpb_password,
                                                    strlen("masterkey"),
                                                    "masterkey"); //passing user //credentials to connect to the database

    bufferLength = strlen(logInData);

    if (isc_attach_database(status_vector, strlen(DATABASE_PATH), DATABASE_PATH, amp;DatabaseHandle,bufferLength, logInData)) // connecting to database
    {
        SQLTestForErrors(status_vector);
        throw(ConnectionError, "");
    }
return 1;
}
char** SQLQuery(char *query, uint maxRows)
{
    isc_tr_handle   transactionHandle = NULL;
    isc_db_handle   database = SQLGetDatabase();
    short           bufferLength;
    char            dpb_buffer[256], *dpb, *p;
    ISC_STATUS      status_vector[20];


    isc_start_transaction(status_vector, amp;transactionHandle, 1, amp;database, 0, NULL);

    if (isc_dsql_execute_immediate(status_vector, amp;database, amp;transactionHandle, 0, query, 1, NULL)) //query operations 'create/insert'
    {
        SQLTestForErrors(status_vector);
        throw(QueryError, "");

    }
    isc_commit_transaction(status_vector, amp;transactionHandle);
   return testString;
}

int main()
{
    //struct Folder_table;
    e4c_using_context(E4C_TRUE)
    {

        SQLOpen();
        SQLQuery(createTable);
        SQLQuery(Insertvalues);
    }

}
  

Ответ №1:

Вы не можете заранее: результирующий набор материализуется во время чтения строк (с использованием isc_fetch ): окончательное количество строк неизвестно, пока вы не прочитаете все строки (после чего вы можете либо посчитать его самостоятельно, либо запросить его с помощью информационного запроса).

Однако я замечаю, что вы пытаетесь использовать isc_dsql_execute_immediate . Вы можете использовать только isc_dsql_execute_immediate для ddl и для запросов, которые выдают одну строку (вам нужно подготовить и выполнить для нескольких строк).

Комментарии:

1. Спасибо за ответ. Когда я выполняю какие-либо (здесь, в примере, который я сделал для создания и вставки) операции и выполняю их, я не могу прочитать размер результата? Я хочу прочитать размер результата, а затем выделить () табличный буфер ASCII, равный размеру результата.

2. Это то, что я сказал: вы не можете запрашивать общее количество строк. При использовании isc_fetch вы можете указать количество строк для извлечения за один вызов.

3. Я ищу команду ISC_fetch в firebird. Я не могу его найти. Скажем, я создал таблицу и вставил в нее 3 строки (например: В приведенном выше коде я вставил 3 значения строк для идентификатора столбца), и я хочу знать размер (я укажу 3 строки для isc_fetch). Не могли бы вы опубликовать код, как отобразить размер.

4. @user3723478 Обычно я работаю только с реализацией протокола wire на Java, поэтому я не знаю все функции C наизусть. Он вызывается isc_dsql_fetch() и описывается на странице 337 руководства Interbase 6.0 API; однако похоже, что он извлекает только одну строку за раз (в отличие от проводного протокола, который позволяет указывать размер выборки)