Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfrage verhält sich in Access anders als über ADO in Delphi (https://www.delphipraxis.net/96228-abfrage-verhaelt-sich-access-anders-als-ueber-ado-delphi.html)

hirnstroem 20. Jul 2007 12:36

Datenbank: Access • Version: kA • Zugriff über: ADO

Abfrage verhält sich in Access anders als über ADO in Delphi
 
'loha Folks,

die untenstehende Abfrage wird in Access ausgeführt:

SQL-Code:
SELECT * FROM [User]
WHERE
Username LIKE :Username
AND
DepartmentID = :DepartmentID
OR
:DepartmentID IS NULL
ORDER BY Username;
Als Parameter übergebe ich ein Sternchen bei Username und bei der DepartmentID nichts. So werden sämtliche Datensätze aus der Tabelle ausgelesen. Ist der Parameter DepartmentID gesetzt, werden nur noch die Datensätze ausgegeben, welche die entsprechende DepartmentID haben. So weit, so gut.

Nehme ich nun dieselbe Abfrage und führe sie in einer Applikation aus, so kann als DepartmentID alles mögliche übergeben werden (Username hat immer noch ein Sternchen beziehungsweise Prozentzeichen als Parameter), es werden trotzdem sämtliche in der Tabelle vorhandenen Datensätze ausgegeben, was ich etwas komisch finde.

In Delphi werden die Parameter wie folgt gesetzt (habe die Werte versuchsweise von Hand eingetragen):

Delphi-Quellcode:
  with ADODataSet_UserDepartment do
  begin
    Close;
    Parameters.ParamByName('Username').Value := '%';
    Parameters.ParamByName('DepartmentID').Value := ''
    Open;
  end;
Wie bereits erwähnt, funktioniert dies aber nicht.

Weiss jemand Rat?

Grüsse
hirnstroem

mkinzler 20. Jul 2007 12:38

Re: Abfrage verhält sich in Access anders als über ADO in De
 
Ado verwendet m.W. ? statt :

hirnstroem 20. Jul 2007 12:44

Re: Abfrage verhält sich in Access anders als über ADO in De
 
? wäre doch aber ein Platzhalter für ein x-beliebiges Zeichen?!

mkinzler 20. Jul 2007 12:45

Re: Abfrage verhält sich in Access anders als über ADO in De
 
SQL-Code:
SELECT * FROM [User]
WHERE
Username LIKE ?Username
AND
DepartmentID = ?DepartmentID
OR
?DepartmentID IS NULL
ORDER BY Username;

Elvis 20. Jul 2007 12:48

Re: Abfrage verhält sich in Access anders als über ADO in De
 
Zitat:

Zitat von hirnstroem
? wäre doch aber ein Platzhalter für ein x-beliebiges Zeichen?!

Hast du zu lange Access benutzt? :shock:
Er meinte natürlich den Parameterindikator. Jet selbst hat keine benannten Parameter, es kann also sein, dass du genauso "?" nehmen kannst, anstatt ":sssw".(Oder musst? kA ich fasse das Viech normal nicht an...)
Du musst die Parameter in der gleichen Reihenfolge besetzten, wie du sie im Statement benutzt. Wie gesagt Jet ist IMO zu blöd für benannte Parameter.

hirnstroem 20. Jul 2007 12:49

Re: Abfrage verhält sich in Access anders als über ADO in De
 
Ach so. Nein, Parameter werden schon mit einem Doppelpunkt bezeichnet.

Mein Problem ist vielmehr, dass in Access mit einem Sternchen als Parameter für Username und einem leeren Parameter für die DepartmentID (oder dann halt irgendeine DepartmentID welche in der Datenbank vorkommt) etwas anderes liefert, als ADO dies tut.

ADO verlangt einfach Prozentzeichen anstatt Sternchen und Fragezeichen anstatt Underlines.

hirnstroem 20. Jul 2007 12:56

Re: Abfrage verhält sich in Access anders als über ADO in De
 
SQL-Code:
DepartmentID = :DepartmentID
OR
:DepartmentID IS NULL
^^ hiermit läuft etwas falsch.

Dem Parameter DepartmentID habe ich schon NULL, Unassigned und alles mögliche übergeben, am Ergebnis ändert alles nichts.

hirnstroem 20. Jul 2007 13:32

Re: Abfrage verhält sich in Access anders als über ADO in De
 
Delphi-Quellcode:
  with ADODataSet_UserDepartment do
  begin
    Close;
    if DepartmentID <> '' then
    begin
      CommandText := 'SELECT * FROM [User] WHERE Username LIKE :Username AND Forename LIKE :Forename AND Surname LIKE :Surname AND DepartmentID = :DepartmentID ORDER BY Username;';
      Parameters.ParamByName('DepartmentID').Value := DepartmentID;
    end
    else CommandText := 'SELECT * FROM [User] WHERE Username LIKE :Username AND Forename LIKE :Forename AND Surname LIKE :Surname ORDER BY Username;';
    Parameters.ParamByName('Username').Value :=
      PrepareSearchString(Username) + '%';
    Parameters.ParamByName('Forename').Value :=
      PrepareSearchString(Forename) + '%';
    Parameters.ParamByName('Surname').Value :=
      PrepareSearchString(Surname) + '%';
    Open;
  end;
Access ist Krieg.

Ich benutze jetzt einfach zwei verschiedene Abfragen.

hoika 20. Jul 2007 14:35

Re: Abfrage verhält sich in Access anders als über ADO in De
 
Hallo,

SQL-Code:
DepartmentID = :DepartmentID
OR
:DepartmentID IS NULL
Wieso übergibst du als zweiten Wert den Paramneter noch mal ?
Müsste das nicht heissen ?
SQL-Code:
DepartmentID = :DepartmentID
OR
DepartmentID IS NULL
Heiko

mkinzler 20. Jul 2007 14:38

Re: Abfrage verhält sich in Access anders als über ADO in De
 
Kommt natürlich darauf an, ob er das Feld oder den Parameter übeprüfen will. Ich vermute aber mal das Feld.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:22 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz