Entwickler-Ecke

Datenbanken - abfrage ADO funzt nicht


Morpheus1572 - Fr 18.07.08 20:28
Titel: abfrage ADO funzt nicht
ich komme nicht weiter. habe jetzt sicher schon 30 versuche und mittlerweile weiß ich nicht mal mehr ob überhaupt was richtig ist.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
procedure TForm5.FormShow(Sender: TObject);
var
  ds: TDataSet;
  AGNr: String;
begin
{ Hier muss ich nun klären ob in AG bereits etwas eingetragen ist. Wenn ja
  dann muss ich die AG-Nr auslesen und diese im Edit1-Feld anzeigen.
  Gleichzeitig muss ich das Feld vor Zugriff schützen, damit niemand mehr den
  Eintrag ändern kann. Das mache ich alles in der PROCEDURE FillFields!
}

  ShowMessage('AG-Zähler: ' + AGZaehler);
  if AGZaehler = '1' then
    begin
      // FillFields;
      Edit1.Enabled := false;
      Button1.Enabled := true;
      ADOQuery1.Active:=false;
      ADOQuery1.SQL.Clear;
      ADOQuery1.SQL.Text :=
        'SELECT AG-Nr FROM AG WHERE AG-ID = :apptype';
      ADOQuery1.Prepared := true;
      ADOQuery1.Parameters.ParamByName('apptype').Value:=AGZaehler;
      ADOQuery1.Active := true;
//      ds := DataSource1.DataSet;
//      ShowMessage(ds);
//      Edit1.Text := ds['AG-Nr'];
    end
end;


ich bekomme die meldung:

'für mindestens einen erforderlichen parameter wurde kein wert angegeben.'

wo hakt es jetzt wieder bei mir? in anderen progs klappt es. ich bin mir nicht mehr sicher was hier passiert.

Thx für eure Unterstützung.

Morph.


Sinspin - Fr 18.07.08 21:34

Prepare ist doch sowas wie ein Test ob die Query geht, wenn ich mich nicht irre.

verschiebe die Zeile:

Delphi-Quelltext
1:
      ADOQuery1.Prepared := true;                    

mal hinter die Zuweisung des Parameterwertes.


Morpheus1572 - Fr 18.07.08 21:42

Hi,

hat leider keine auswirkung. ist der selbe fehler.


Sinspin - Fr 18.07.08 22:04

Dann versuch es mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
...
      ADOQuery1.Active:=false;
      //ADOQuery1.SQL.Clear; <-- ist überflüssig bei zuweisung an text
      ADOQuery1.SQL.Text :=
        'SELECT AG-Nr FROM AG WHERE AG-ID = :apptype';
      ADOQuery1.Prepared := true;
      ADOQuery1.Parameters.ParamByName('apptype').AsString:=AGZaehler;
      ADOQuery1.Active := true;
...

oder so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
...
      ADOQuery1.Active:=false;
      //ADOQuery1.SQL.Clear; <-- ist überflüssig bei zuweisung an text
      ADOQuery1.SQL.Text :=
        'SELECT AG-Nr FROM AG WHERE AG-ID = '+QuotedStr(AGZaehler);
      ADOQuery1.Prepared := true;
      ADOQuery1.Active := true;
...


Morpheus1572 - Fr 18.07.08 22:19

Hi Sinspin,

dein erster vorschlag geht nicht, da ich bei eingabe von '.' keine auswahl für AsString erhalte (weil AGZaehler bei mir als String deklariert ist?)

die 2te Variante bringt mir eine andere Fehlermeldung:

ParameterAG hat keinen Standartwert.

...


Morpheus1572 - Sa 19.07.08 09:07

Moin,

des Rätzels Lösung und so simpel wie blödsinnig zugleich. Microschrott eben... :roll:

In diesem Fall ist es ein GROßER FEHLER, die Feldnamen der Tabelle mit Bindestrichen zu versehen. Das mag Access gar nicht. In diesem Sinne wünsche ich allen ein schönes WE.

Morph.


alzaimar - Sa 19.07.08 11:05

user profile iconMorpheus1572 hat folgendes geschrieben:
es Rätzels Lösung und so simpel wie blödsinnig zugleich. Microschrott eben... :roll:
Hach, das man alles immer auf MS schiebt, ist schon bezeichnend: Erstmal das Hirn einschalten, bevor man den Fehler woanders sucht (auch wenns Wochenende ist).
Wo ist denn der Unterschied zwischen der Variablen/Spaltennamen 'XY-Z' und dem Term (Subtraktion zweier Spalten) 'XY-Z'? Wie soll ein Parser das wissen? SQL ist so gnädig und erlaubt uns trotzdem, Leer- und Sonderzeichen in Spaltennamen zu verwenden, nur muss man sie dann entsprechend 'escapen', hier wäre das die Umschließung mit '[]'.

Um nun doch ein wenig auf Microsoft bzw. eher der Access-Abteilung rumzuhaken: Ob das mit Access geht, weiss ich nicht, weil der Access'sche SQL-Dialekt schon sehr eigene Wege geht. So wie MySQL z.B.


Agawain - Sa 19.07.08 11:59

Hi

Bindestriche. Leerzeichen usw. sind wirklich pfui für Spaltennamen.
Das Einzige, was ich mir da erlaube, ist der Unterstrich.

Das hat indirekt nur insoweit was mit Microschrott zu tun, als die Redmonder diese Möglichkeit erst eröffnet haben.
Excel und Access gehen mit diesen Features relativ großzügig um, kommen damit aber nicht unbedingt selbst mit klar.
Und das gilt für Fremdsoftware erst recht.

Gaaaanz schlechte Angewohnheit, Sonderzeichen irgendwo zu verwenden, sei es bei Dateibenennung, oder Feldnamen etc. alles was Steuerfunktion haben kann, da gehört sowas weg.

Selbst der Unterstrich ist kritisch zu beäugen ;-)
und überlange Dateinamen ebenfalls.

Gehört zwar nicht unbedingt zur Frage des Threaderstellers, aber Excel-Tabellen-Spalten-Überschriften mehrzeilig kommen auch immer gut, vor allem, wenn man Serienbrief macht :evil:


alzaimar - Sa 19.07.08 13:20

user profile iconAgawain hat folgendes geschrieben:
Das hat indirekt nur insoweit was mit Microschrott zu tun, als die Redmonder diese Möglichkeit erst eröffnet haben.
ANSI SQL definiert 'Quoted Identifiers', also nix Microsoft. Und Microschrott kenne ich gar nicht.


Morpheus1572 - Di 22.07.08 11:08

Moin,

danke für die ausführlichen hinweise. die sind mir mittlerweile auch klar geworden. :D

@alzaimar: das mit den []-Klammern habe ich auch probiert. funzt aber genau so wenig. deswegen bin ich hier rein gekommen. ich versuche mich erst 1-2 tage an meinen Problemen bis ich hier poste. Aber hast recht Access hat wirklich einen sehr eigenen SQL-Dialekt. Bei JOIN-Abfragen zum Beispiel. hatte vor jahren schon mal das vergnügen und stehe demnächst wieder vor dem Problem die besonderheiten davon rauszufinden. :-)

Naja, es funzt und das ist wichtig. danke noch mal!!!


Gruß Morph.