/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Læseadgang fra c++ til Borland Interbase
Fra : Per Asbjoern Jensen


Dato : 28-02-01 11:20

Hej,

Jeg sidder og slåser med at få min c++ til at få læse adgang i en Interbase
db, men det driller konstant. Jeg har prøvet med dokumentationen fra
borland, men dog uden større held.
Er der ikke nogen der har et lille simpelt eksempel på en rutine der læser
fra en tabel i en foruddefineret db.
Det vil simpelthen gøre min uge.

På forhånd TAK

Per Asbjørn Jensen



 
 
Mogens Hansen (28-02-2001)
Kommentar
Fra : Mogens Hansen


Dato : 28-02-01 12:40

Hej Per,

"Per Asbjoern Jensen" <per.a.jensen@mail.dk> wrote in message
news:xh4n6.5776$dD.333551@twister.sunsite.dk...
> Hej,
>
> Jeg sidder og slåser med at få min c++ til at få læse adgang i en
Interbase
> db, men det driller konstant. Jeg har prøvet med dokumentationen fra
> borland, men dog uden større held.
> Er der ikke nogen der har et lille simpelt eksempel på en rutine der læser
> fra en tabel i en foruddefineret db.

Det afhænger af hvilken måde du vil tilgå Interbase.
De valgmuligheder du oplagt har fra C/C++ er:
* BDE (Borland Database Engine)
* ODBC, men det kræver en trediepart ODBC driver for at udnytte de nyeste
ting i Interbase 6 - f.eks. fra easysoft (www.easysoft.com) - se manualen
"Developer's Guide", kapitel 5
* database komponenterne der følger med C++Builder - se manualen
"Developer's Guide", kapitel 3
* IBX - Interbase Express. Det er forbeholdt Delphi og C++Builder - se
manualen "Developer's Guide", kapitel 8
* Embedded SQL - se manualen "Embedded SQL Guide"
* Interbase's native API - se manualen "API Guide"

Hvis du bruger native API findes der en række eksempler i biblioteket
(???)\InterBase\examples\Api.
Det var manualen "API Guide" og eksemplerne jeg brugte for at få native API
til at virke.

Hvis du vil bruge Embedded SQL findes der en række eksempler i biblioteket
(???)\InterBase\examples\Gpre.

Jeg håber at det kan hjælpe dig - ellers spørg igen.

Venlig hilsen

Mogens Hansen



Per Asbjoern Jensen (01-03-2001)
Kommentar
Fra : Per Asbjoern Jensen


Dato : 01-03-01 10:48

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;
}




Mogens Hansen (01-03-2001)
Kommentar
Fra : Mogens Hansen


Dato : 01-03-01 12:12

Hej Per,
"Per Asbjoern Jensen" <per.a.jensen@mail.dk> wrote in message
news:cVon6.10176$dD.493148@twister.sunsite.dk...
> static char ISC_FAR *query = "SELECT COUNTRY FROM COUNTRY";

Den skal ihvertfald udvides til f.eks.:
static char ISC_FAR *query = "SELECT COUNTRY, CAPITAL FROM COUNTRY";
eller
static char ISC_FAR *query = "SELECT * FROM COUNTRY";


> /* Prepare sqlda for singleton fetch */
> sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(1));

Her skal allokeres nogle flere XSQLVAR

> sqlda->sqln = sqlda->sqld = 1;
> sqlda->version = 1;
> sqlda->sqlvar[0].sqldata = uname;
> sqlda->sqlvar[0].sqlind = &nullind;

Her skal der sættes de næste XSQLVAR initialiseres.

Se eksemplet "(???)\InterBase\examples\Api\api5.c" for et eksempel, der
formodentlig gør hvad du har brug for.

Om der er andre ting galt (udover manglen på pæn nedlukning i tilfælde af
fejl) skal jeg ikke kunne sige.

Venlig hilsen

Mogens Hansen



Per Asbjoern Jensen (01-03-2001)
Kommentar
Fra : Per Asbjoern Jensen


Dato : 01-03-01 13:22

HURRA!!
Det var jo lige det der manglede.

Mogens du skal have mange tak. Det var blot en tanke-torsk fra min side og
du kan tro jeg råbte rigtig højt, da jeg læste dit indslag. Det er jo så
indlysende, men jeg havde set mig totalt blind på det. Men nu virker det!!

TAK FOR DET.

med mange glade hilsner
Per Asbjørn Jensen
"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:3a9e2e69$1@lxcs1.manbw.dk...
> Hej Per,
> "Per Asbjoern Jensen" <per.a.jensen@mail.dk> wrote in message
> news:cVon6.10176$dD.493148@twister.sunsite.dk...
> > static char ISC_FAR *query = "SELECT COUNTRY FROM COUNTRY";
>
> Den skal ihvertfald udvides til f.eks.:
> static char ISC_FAR *query = "SELECT COUNTRY, CAPITAL FROM COUNTRY";
> eller
> static char ISC_FAR *query = "SELECT * FROM COUNTRY";
>
>
> > /* Prepare sqlda for singleton fetch */
> > sqlda = (XSQLDA ISC_FAR *) malloc(XSQLDA_LENGTH(1));
>
> Her skal allokeres nogle flere XSQLVAR
>
> > sqlda->sqln = sqlda->sqld = 1;
> > sqlda->version = 1;
> > sqlda->sqlvar[0].sqldata = uname;
> > sqlda->sqlvar[0].sqlind = &nullind;
>
> Her skal der sættes de næste XSQLVAR initialiseres.
>
> Se eksemplet "(???)\InterBase\examples\Api\api5.c" for et eksempel, der
> formodentlig gør hvad du har brug for.
>
> Om der er andre ting galt (udover manglen på pæn nedlukning i tilfælde af
> fejl) skal jeg ikke kunne sige.
>
> Venlig hilsen
>
> Mogens Hansen
>
>



Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste