Avatar billede kennethv Nybegynder
24. september 2008 - 23:01 Der er 11 kommentarer og
1 løsning

ADOQuery access violation

Hej med jer.

Jeg er stødt ind et problem som jeg synes virker lidt underligt.
Hvis jeg i design-time laver dette på min ADOQuery, har jeg ingen problemer:

SELECT CN FROM 'LDAP://OU=laptops,OU=computers,OU=so,OU=dk,OU=alfalaval,DC=AD,DC=ALFALAVAL,DC=ORG' WHERE ObjectClass='computers AND managedby='CN=Helle Bare,OU=users,OU=so,OU=dk,OU=domain,DC=AD,DC=DOMAIN,DC=ORG'

men hvis jeg gør dette i runtime, for jeg en access violation at address 0049962B i linien "Add('SELECT CN');"


  with ADOQuery1 do begin
    with SQL do begin
      Clear;
      Add('SELECT CN');
      Add('FROM ' + Quotedstr('LDAP://OU=laptops,OU=computers,OU=so,OU=dk,OU=domain,DC=AD,DC=DOMAIN,DC=ORG'));
      Add('WHERE ObjectClass=' + Quotedstr('computers') + ' AND managedby=' + Quotedstr('CN='+ ComboBox1.Text+',OU=users,OU=so,OU=dk,OU=domain,DC=AD,DC=DOMAIN,DC=ORG'));
    end;
    Open;
  end;

Mangler jeg at gøre noget?
Avatar billede arne_v Ekspert
25. september 2008 - 11:04 #1
Det lyder som om der er noget der ikke er initialiseret korrekt (mangelende Create/Init kald).
Avatar billede hrc Mester
25. september 2008 - 12:44 #2
Prøv at fjerne with'erne. Jeg har få gange oplevet at den "withede" forkert. I øvrigt en hæslig syntaks for at gå ombord i AD-databasen (det er måske derfor den hedder "ad"?).

  assert(assigned(ADOQuery1)); // En god lille tjek

  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Add('SELECT CN');
  ADOQuery1.SQL.Add('FROM ' + Quotedstr('LDAP://OU=laptops,OU=computers,OU=so,OU=dk,OU=domain,DC=AD,DC=DOMAIN,DC=ORG'));
  ADOQuery1.SQL.Add('WHERE ObjectClass=' + Quotedstr('computers') + ' AND managedby=' + Quotedstr('CN='+ ComboBox1.Text+',OU=users,OU=so,OU=dk,OU=domain,DC=AD,DC=DOMAIN,DC=ORG'));
  ADOQuery1.SQL.Open;
Avatar billede kennethv Nybegynder
26. september 2008 - 10:33 #3
Desværre, samme fejl.

Prøvede noget andet, men samme fejl. Den fejler i ADOQuery1.SQL.Text.

procedure TDeleteForm.FormCreate(Sender: TObject);
begin
  ADOQuery1.Connection := MainForm.ADOConnection2;
  assert(assigned(ADOQuery1)); // En god lille tjek
  ComboBox1.Clear;
  ADOQuery1.SQL.Clear;
  ADOQuery1.SQL.Text :=  'SELECT NAME FROM '+ Quotedstr('LDAP://OU=users,OU=so,OU=dk,OU=domain,DC=AD,DC=DOMAIN,DC=ORG')+ ' WHERE objectClass='+ Quotedstr('user') + ' ORDER by NAME';
  ADOQuery1.Open;
  try
    while not ADOQuery1.Eof do
    begin
      ComboBox1.Items.Add(ADOQuery1.FieldByName('NAME').AsString);
      ADOQuery1.Next;
    end;
  finally
    ADOQuery1.Close;
  end;
  DateTimePicker2.Date := date;
end;

Hvis man har flere ADOQuery i programmet. 1 på hver form. Har det nogen betydning?
Avatar billede hrc Mester
26. september 2008 - 12:27 #4
Måske, men næppe. Prøv at sætte "self." foran alle linjerne. Det burde eliminere forkerte referencer. Det lyder meget underligt at du kan lave en "Clear", men ikke tilgå en Text"-property i SQL-listen.

procedure TDeleteForm.FormCreate(Sender: TObject);
begin
  self.ADOQuery1.Connection := MainForm.ADOConnection2;
  assert(assigned(self.ADOQuery1)); // En god lille tjek
  assert(assigned(self.ADOQuery1.SQL)); // En god lille tjek
  ComboBox1.Clear;
  self.ADOQuery1.SQL.Clear;
  self.ADOQuery1.SQL.Text :=  'SELECT NAME FROM '+ Quotedstr('LDAP://OU=users,OU=so,OU=dk,OU=domain,DC=AD,DC=DOMAIN,DC=ORG')+ ' WHERE objectClass='+ Quotedstr('user') + ' ORDER by NAME';
  self.ADOQuery1.Open;
  try
    while not self.ADOQuery1.Eof do
    begin
      ComboBox1.Items.Add(self.ADOQuery1.FieldByName('NAME').AsString);
      self.ADOQuery1.Next;
    end;
  finally
    self.ADOQuery1.Close;
  end;
  DateTimePicker2.Date := date;
end;

Næste forsøg kan være at oprette Query'en lokalt. Under alle omstændigheder burde det egentlig være den rette implementering i stedet for at referere til en fælles gummi-query (noget jeg ikke vil se i mine programmer). Jeg tror denne løsning vil virke:

procedure TDeleteForm.FormCreate(Sender: TObject);
var
  Query: TADOQuery;
begin
  Query := TADOQuery.Create(nil);
  try
    Query.Connection := MainForm.ADOConnection2;
    assert(assigned(Query)); // Et ditto godt lille tjek
    assert(assigned(Query.SQL)); // En god lille tjek
    Query.SQL.Clear;
    Query.SQL.Text :=  'SELECT NAME FROM '+ Quotedstr('LDAP://OU=users,OU=so,OU=dk,OU=domain,DC=AD,DC=DOMAIN,DC=ORG')+ ' WHERE objectClass='+ Quotedstr('user') + ' ORDER by NAME';
    Query.Open;

    ComboBox1.Clear;
    while not Query.Eof do
    begin
      ComboBox1.Items.Add(Query.FieldByName('NAME').AsString);
      Query.Next;
    end;
    DateTimePicker2.Date := Date;
  finally
    Query.Free;
  end;
end;
Avatar billede kennethv Nybegynder
26. september 2008 - 14:17 #5
Nu prøvede jeg at lave en helt nyt program kun med det. Og jeg får den samme fejl.

Jeg fatter det ikke.
Avatar billede kennethv Nybegynder
26. september 2008 - 14:18 #6
Hov. Jeg så ikke det svar. Tjekker det lige.
Avatar billede kennethv Nybegynder
26. september 2008 - 14:32 #7
Hvis jeg i samme nye program kun laver det du har skrevet, HRC, får jeg samme status.

:(
Avatar billede kennethv Nybegynder
26. september 2008 - 22:54 #8
linien der er problemet. Det der sker er:

Jeg får besked # 1 - Trykker ok
Får samme fejl - vælge at forsætte.
Jeg får besked # 2 - Trykker ok.

Jeg får det jeg forventer i min ComboBox, måske har jeg gjort det hele tiden, for jeg valgte at stoppe programmet, pga fejlen. Men som sagt er jeg ikke interesseret i fejlen.

procedure TForm1.FormShow(Sender: TObject);
begin
  assert(assigned(ADOQuery1));
  assert(assigned(ADOQuery1.SQL));
  ComboBox1.Clear;
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  Showmessage('1');
  ADOQuery1.SQL.Text := 'SELECT NAME FROM '+ Quotedstr('LDAP://OU=users,OU=so,OU=dk,OU=domain,DC=AD,DC=domain,DC=ORG')+ ' WHERE objectClass='+ Quotedstr('user') + ' ORDER by NAME';
  Showmessage('2');
  ADOQuery1.Open;
  try
    while not ADOQuery1.Eof do
    begin
      ComboBox1.Items.Add(ADOQuery1.FieldByName('NAME').AsString);
      ADOQuery1.Next;
    end;
  finally
    ADOQuery1.Close;
  end;
  combobox1.SetFocus;
end;
Avatar billede kennethv Nybegynder
26. september 2008 - 22:56 #9
Jeg flyttede det ned i OnShow, for at prøve noget andet. Jeg tilføjede nogle ShowMessage omkring den linien der er problemet. Det der sker er:

Jeg får besked # 1 - Trykker ok
Får samme fejl - vælge at forsætte.
Jeg får besked # 2 - Trykker ok.

Jeg får det jeg forventer i min ComboBox, måske har jeg gjort det hele tiden, for jeg valgte at stoppe programmet, pga fejlen. Men som sagt er jeg ikke interesseret i fejlen.

procedure TForm1.FormShow(Sender: TObject);
begin
  assert(assigned(ADOQuery1));
  assert(assigned(ADOQuery1.SQL));
  ComboBox1.Clear;
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  Showmessage('1');
  ADOQuery1.SQL.Text := 'SELECT NAME FROM '+ Quotedstr('LDAP://OU=users,OU=so,OU=dk,OU=domain,DC=AD,DC=domain,DC=ORG')+ ' WHERE objectClass='+ Quotedstr('user') + ' ORDER by NAME';
  Showmessage('2');
  ADOQuery1.Open;
  try
    while not ADOQuery1.Eof do
    begin
      ComboBox1.Items.Add(ADOQuery1.FieldByName('NAME').AsString);
      ADOQuery1.Next;
    end;
  finally
    ADOQuery1.Close;
  end;
  combobox1.SetFocus;
end;
Avatar billede kennethv Nybegynder
27. september 2008 - 00:20 #10
Problemet er løst. Når jeg kører exe filen kommer fejlen ikke. Så det er nok bare en information til mig som udvikler at jeg kunne gøre noget ved denne fejl.
Avatar billede hrc Mester
28. september 2008 - 21:27 #11
Jeg vil ikke sige at problemet er løst. Det er ignoreret - som at tage en Albyl for hovedpine hvor man burde undersøge hvorfor man har den, hovedpinen.

Det er aldeles fornuftstridigt du får de her fejl. At den undertrykkes lyder dog som om det er en kendt fejl som en programmør har hacket sig forbi.
Jeg selv har aldrig set en sådan fejl (kører ADO D7, D2006 og D2007 på MSSQL). At du leger med AD-databasen tror jeg ikke har noget at sige. Selecten er ikke kørt endnu.

Prøvede du nogensinde det sidste eksempel hvor alt blev oprettet i lokalt scope? Kan ikke tro den vil fejle.
Avatar billede kennethv Nybegynder
29. september 2008 - 08:24 #12
Ja, jeg prøve begge dine forslag. Fik samme fejl i begge situationer.

:(
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