Avatar billede iver25 Nybegynder
10. oktober 2001 - 16:20 Der er 8 kommentarer og
1 løsning

Brug samme variabel flere gange

Jeg bruger q på følgende måde som variabel til at hente værdier i en access database. Men jeg vil gerne bruge samme variabel til at hente andre værdier. Hvorfor kan jeg ikke det, når jeg free\'er den til sidst.

Jeg får en access vialation hvis jeg prøver at create en ny q.

  q := frmDatabase.QueryMedlem.Create(nil);
  q.DatabaseName := frmdatabase.QueryMedlem.DatabaseName;
  q.SQL.Clear;
  q.SQL.Add(\'SELECT navn FROM medlem WHERE (stregkode=\'\'\'+stregkode+\'\'\')\');
  q.open;
  result :=  q.FieldByName(\'navn\').AsString;
  q.close;
  q.free;
Avatar billede martinlind Nybegynder
10. oktober 2001 - 16:28 #1
Hvilken version af delphi kører du, det lyder mærkeligt, prøv at sætte break on exception og se hvor det går galt
Avatar billede iver25 Nybegynder
10. oktober 2001 - 16:31 #2
Jeg bruger Delphi 6. Hvad mener du med break on exception. Jeg har prøvet at sætte et break, og så steppe med F7, for at se hvor det går galt, og det gør det lige når den skal til at create en ny q.
Avatar billede snowball Novice
10. oktober 2001 - 16:32 #3
Prøv og lav din q1.Close noget før. Jeg havde et lign. problem, dog bare med ADO

  q := frmDatabase.QueryMedlem.Create(nil);
  q.DatabaseName := frmdatabase.QueryMedlem.DatabaseName;
  q.close;
  q.SQL.Clear;
  q.SQL.Add(\'SELECT navn FROM medlem WHERE (stregkode=\'\'\'+stregkode+\'\'\')\');
  q.open;
  result :=  q.FieldByName(\'navn\').AsString;
  q.free;


Snowball
Avatar billede iver25 Nybegynder
10. oktober 2001 - 16:37 #4
Jeg får stadig samme access violation
Avatar billede martinlind Nybegynder
10. oktober 2001 - 16:46 #5
Du kan sætte delphi til \"Stop on Delphi exception\"

Nåe ja, du skal prøve at lave en q.Close i linen før du laver en Q.Free:


q := frmDatabase.QueryMedlem.Create(nil);
  q.DatabaseName := frmdatabase.QueryMedlem.DatabaseName;
  q.close;
  q.SQL.Clear;
  q.SQL.Add(\'SELECT navn FROM medlem WHERE (stregkode=\'\'\'+stregkode+\'\'\')\');
  q.open;
  result :=  q.FieldByName(\'navn\').AsString;
  q.close;
  q.free


/Martin
Avatar billede kim_friis Nybegynder
10. oktober 2001 - 16:47 #6
Det er fordi at du siger:
q := frmDatabase.QueryMedlem.Create(nil);
Det kan man ikke. Create er en constructor som skal kaldes fra en klasse og ikke fra et object.

Du skal istedet for sige:
Q := TQuery.Create(nil);
Q.SQL.Assign(frmDatabase.QueryMedlem.SQL);

og så fremdeles hvis der er flere properties som du vil have med over.
Avatar billede iver25 Nybegynder
10. oktober 2001 - 16:57 #7
Jeg har skrevet følgende:
  q := TQuery.Create(nil);
  q.SQL.Assign(frmDatabase.QueryMedlem.SQL);
  q.close;
  q.SQL.Clear;
  q.SQL.Add(\'SELECT medlemsnummer FROM medlem WHERE (stregkode=\'\'\'+stregkode+\'\'\')\');
  q.open;
  result :=  q.FieldByName(\'medlemsnummer\').AsInteger;
  q.close;
  q.free;


Når jeg når til q.open, får jeg en fejl der siger: \"Cannot load an IDAPI service library\"
Avatar billede kim_friis Nybegynder
10. oktober 2001 - 17:02 #8
Ok, undskyld, jeg havde faktisk ikke lige set at du brugte SQL.Clear og SQL.Add længere nede.

Det du skal istedet for er at du skal assigne hvilket Alias at querien peget på også til Q.

Q.DatabaseName := frmDatabase.QueryMedlem.Databasename

Eller hvad den lige hedder.

Jeg går her ud fra at din QueryMedlem er en almindelig TQuery. Hvis det er af en anden type, så skal du erstatte TQuery med den pågældende type som du bruger. Og HUSK at overføre alle properties fra din QueryMedlem til koden istedet.
Avatar billede iver25 Nybegynder
10. oktober 2001 - 17:06 #9
Nu virker det bare. Tak for hjælpen!
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