Avatar billede myplacedk Nybegynder
18. juli 2003 - 21:45 Der er 12 kommentarer og
1 løsning

sqlite (newbie)

Jeg prøver at lave noget C++, men jeg har problemer med sqlite. Jeg har på fornemmelsen at problemet har noget med pointere at gøre, men... Well...

Her er et udsnit af koden, den stump der giver problemer:

1:bool dbinsert(char* file)
2:{
3:  printf("Insætter nu \"%s\" i databasen.\n", file);
4:  char *zErrMsg = 0;
5:  char sql[1024];
6:  int rc;
7:  sqlite *db = sqlite_open(dbfile, 0, &zErrMsg); // Second argument currently ignored by sqlite
8:  if( db==0 )
9:  {
10:    fprintf(stderr, "Can't open database: %s\n", zErrMsg);
11:    // FIXME: Free memory for zErrMsg
12:    return false;
13:  }
14:  sprintf(sql, "INSERT INTO files values ('%s','%s');", file, file);
15:  printf("SQL: %s\n", sql);
16:  rc = sqlite_exec(db, sql, NULL, 0, &zErrMsg);
17:  printf("Result: %n\n", rc);
18:  return false;
19:}

Eksempel på output:

Insætter nu "tester" i databasen.
SQL: INSERT INTO files values ('tester','tester');
Segmentation fault

Det er nok der, hvor der står "sql" på linje 16, der er noget galt. Men hvad?
Avatar billede fn1977 Nybegynder
18. juli 2003 - 22:06 #1
slutter du ikke linje 14 med  ;  2 gange
Avatar billede fn1977 Nybegynder
18. juli 2003 - 22:07 #2
ummidelbart vil jeg tro den ikke udføre file file... og slut på sql statement bliver da heller ikke udført ordentligt
Avatar billede myplacedk Nybegynder
18. juli 2003 - 22:17 #3
I linje 14? SQL'en der bliver udskrevet i linje 15 ser rigtig ud, og hvis jeg giver den direkte til sqlite virker den også.
Avatar billede myplacedk Nybegynder
18. juli 2003 - 22:18 #4
Det første semikolon i linje 14 står inden for double quotes. Det er bare et semikolon, det har kun betydning for "sql-serveren".
Avatar billede fn1977 Nybegynder
18. juli 2003 - 22:25 #5
ok. definere du ikke sql i linje 14... og hvis skal der så ikke et = tegn ind ?
Avatar billede myplacedk Nybegynder
18. juli 2003 - 22:35 #6
Jeg tror ikke der er noget i vejen med linje 14. SQL'en der udskrives i linje 15 er jo 100% korrekt.
Så vidt jeg har forstået sprintf, så er første parameter den variable, resultatet skal gemmes i. Og det ser da ud til at virke...
Jeg tror stadig fejlen er i linje 16. Det er også der den segfaulter...
Avatar billede arne_v Ekspert
18. juli 2003 - 23:22 #7
Din C kode ser meget OK ud - jeg har kigget meget på den og jeg kan
ikke umiddelbart se nogen fejl.

(du veksler lidt mellem NULL og 0 men det betyder ikke noget)

Jeg tænker mere på om det kan være et kompabilitets problem mellem
din compiler og den librariet er compilet med.
Avatar billede myplacedk Nybegynder
18. juli 2003 - 23:29 #8
Jeg veksler mellem NULL og 0, fordi jeg selv foretrækker NULL, men ikke har rettet det når jeg har kopieret fra eksempler. ;-)

Det er muligt at det er et compiler-problem, jeg har ikke selv kompileret sqlite.
Jeg vil prøve en gang mere i morgen om jeg kan finde kildekoden til seneste release, ellers må jeg jo prøve med CVS'en.
Avatar billede sovsekoder Nybegynder
19. juli 2003 - 00:06 #9
l17 : printf("Result: %n\n", rc);

skal være %d istedet for %n, og nu virker det nok uden at gå ned.
Avatar billede sovsekoder Nybegynder
19. juli 2003 - 00:10 #10
:-) jeg har downloaded sqlite og lavet en test i MSVC, og det virker (cool sql-interface!!...)

formatet for callback-funktionen er :

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
eksempel (fra deres hjemmeside) :
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}
funktionen kører gennem alle rows i resultatet og printer dem ud.
Avatar billede arne_v Ekspert
19. juli 2003 - 00:11 #11
Jeps.

Det er den

Den får printf til at ville gemme antal tegn skrevet i den adresse
rc angiver (hvsi rc er nul så i adresse 0) - det skal nok give
en segmentation fault.
Avatar billede myplacedk Nybegynder
19. juli 2003 - 10:35 #12
Damn... Synes ellers jeg havde prøvet at sætte noget ind mellem de to linjer, som ikke blev udført før segfault...

Men nu virker det, tak for hjælpen. :)
Sovsekoder, lav lige et svar...

> cool sql-interface!!...

Ja, sqlite ser ud til at være et herligt værktøj. Det har mindst halveret C++-arbejdet med det program, jeg er i gang med. :)

Men det med en callback-funktion, det kan jeg ikke lige se det smarte i. Jeg ville jo læse resultatet i fx. en while-løkke, i samme funktion, som db-kaldet er i. Men når jeg har arbejdet lidt med det, kan det da godt være, at jeg kan se fidusen. :)
Avatar billede sovsekoder Nybegynder
19. juli 2003 - 10:45 #13
aha nu forstår jeg hvad et svar er :-o - wuhuuu!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester