如何阅读firebird数据库查询结果大小?

时间:2014-06-16 14:58:23

标签: c malloc firebird

我正在使用firebird数据库进行C接口。我做了一些查询操作。我想知道如何读取结果大小?

以下是代码。我已经创建并在表中插入了一些值。我想读取结果的大小。

#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, &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, &transactionHandle, 1, &database, 0, NULL);

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

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

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

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

}

1 个答案:

答案 0 :(得分:0)

您无法提前:在您阅读行时使用isc_fetch)实现了结果集:在您阅读完所有行之前,不知道最终行数(此时您可以自己计算,或用信息请求查询。)

但是我注意到您尝试使用isc_dsql_execute_immediate。您只能将isc_dsql_execute_immediate用于ddl以及用于生成一行的查询(您需要为多行准备和执行)。