Hej,
Tak for hjælpen endtil nu. Nu har jeg da fået hul igennem, men stadig et par
uoverensstemmelser(nedestående) som jeg håber I kan hjælpe mig med.
Kræves alt i nedestående for at kunne læse fra IB? Programmet skal, hurtig
fortalt, bruges på et minimum system, så hvis det kunne minimeres ville det
være at foretrække.
Ellers virker det som ønsket, bortset fra at jeg gerne vil læse en hel
række(row) ud istedet for en enkel celle som eksempelet gør. Men der får jeg
seriøse problemer. Programmet konstant udføre en ulovlighandling og jeg
forstår det ikke, da det skulle være "lige-til" Er der nogen der kan komme
med en rettelse til understående, et hint eller en lille uddybning af
nedestående. Vil jeg bliver utrolig glad. Jeg tror jeg er ved at stirre mig
blind på nedestående, men samtidig kan mærke at løsningen er lige rundt om
hjørnet.
Men igen tak for hjælpen endtil nu. Jeg håber nogen kan vise mig vej rundt
om hjørnet, da det efterhånden er ved at blive en besættelse.
Per Asbjørn Jensen
/*
* Program type: IB access via API
*/
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "example.h"
#include <ibase.h>
int main (ARG(int, argc), ARG(char **, argv))
ARGLIST(int argc)
ARGLIST(char **argv)
{
isc_db_handle db = NULL; /* database handle */
isc_tr_handle trans = NULL; /* transaction handle */
isc_stmt_handle stmt = NULL;
long status[20]; /* status vector */
char dbname[128];
char user_name[31], uname[81];
short nullind;
char password[31];
/* Query to find current user name */
static char ISC_FAR *query = "SELECT COUNTRY FROM COUNTRY";
char ISC_FAR * dpb = NULL, /* DB parameter buffer */
/**d,*/ *p, *copy;
XSQLDA ISC_FAR *sqlda;
short dpb_length = 0;
strcpy(user_name, "paj");
strcpy(password, "paj");
strcpy(dbname, "employee.gdb");
if (argc > 1)
strcpy(dbname, argv[1]);
if (argc > 2)
strcpy(user_name, argv[2]);
if (argc > 3)
strcpy(password, argv[3]);
/* Adding sweep interval will be done by hand
** First byte is a version (1), next byte is the isc_dpb_sweep
** byte, then a length (4) then the byte-swapped int we want
** to provide -- 7 bytes total
*/
copy = dpb = (char *) malloc(7);
p = dpb;
*p++ = '\1';
*p++ = isc_dpb_sweep_interval;
*p++ = '\4';
dpb_length = 7;
/* Add user and password to dpb, much easier. The dpb will be
** new memory.
*/
isc_expand_dpb(&dpb, (short ISC_FAR *) &dpb_length,
isc_dpb_user_name, user_name,
isc_dpb_password, password, NULL);
/*
** Connect to the database with the given user and pw.
*/
printf("Attaching to %s with user name: %s, password: %s\n",
dbname, user_name, password);
if (isc_attach_database(status, 0, dbname, &db, dpb_length, dpb))
isc_print_status(status);
if (isc_start_transaction(status, &trans, 1, &db, 0, NULL))
isc_print_status(status);
/* Prepare sqlda for singleton fetch */
sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(1));
sqlda->sqln = sqlda->sqld = 1;
sqlda->version = 1;
sqlda->sqlvar[0].sqldata = uname;
sqlda->sqlvar[0].sqlind = &nullind;
/* Yes, it is possible to execute a singleton select without
** a cursor. You must prepare the sqlda by hand.
*/
isc_dsql_allocate_statement(status, &db, &stmt);
if (isc_dsql_prepare(status, &trans, &stmt, 0, query, 1, sqlda))
{
ERREXIT(status, 1)
}
/* Force to type sql_text */
sqlda->sqlvar[0].sqltype = SQL_TEXT;
if (isc_dsql_execute(status, &trans, &stmt, 1, NULL))
{
ERREXIT(status, 1)
}
/* There will only be one row. If it isn't there, something is
** seriously wrong.
*/
if (isc_dsql_fetch(status, &stmt, 1, sqlda))
{
ERREXIT(status, 1)
}
isc_dsql_free_statement(status, &stmt, DSQL_close);
uname[sqlda->sqlvar[0].sqllen] = '\0';
printf ("Data = %s\n", uname);
if (isc_commit_transaction(status, &trans))
{
ERREXIT(status, 1)
}
isc_detach_database(status, &db);
isc_free(dpb);
free(copy);
free(sqlda);
return 0;
}
|