Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi [ADO] Attribut IS IN (:Parameter) - Funktioniert nicht (https://www.delphipraxis.net/126940-%5Bado%5D-attribut-parameter-funktioniert-nicht.html)

Zwoetzen 5. Jan 2009 12:30

Datenbank: MSAccess • Zugriff über: ADO

[ADO] Attribut IS IN (:Parameter) - Funktioniert nicht
 
Hi DP'ler,

ich bin gerade dabei, meine Kenntnisse im Umgang mit der Datenbank etwas zu verbessern. Mein momentanes Problem ist dabei folgendes:

Ich möchte zu einer bekannten Liste von ID-Nummern die entsprechenden Datensätze aus der Datenbank holen und weiterverarbeiten. Dazu verwende ich folgendes Query:

SQL-Code:
SELECT * FROM Test WHERE ID IN (:IDList)
Nun bekomme ich aber folgendes Verhalten:
* Bei einer einzelnen ID (zB "42") für den Parameter IDList funktioniert alles: Ich bekomme genau den gewünschten Datensatz.
* Bei zwei IDs (zB "42,16") bekomme ich auch nur einen Datensatz: Es scheint, als würde der Wert als Zahl betrachtet und gerundet werden. (Dh bei "42,6" bekomme ich die 43, bei "42,4" die 42)
* Ab 3 Werten bekomme ich eine leere Datenmenge (zB "42,56,91")


Einige Codeschnipsel:
Delphi-Quellcode:
type TMyDatabase = class(TObject)
private  
    FConnection: TADOConnection;
    FDSIDList:  TADODataSet;
[...]
end;
Delphi-Quellcode:
constructor TMyDatabase.Create;
begin
[...] // u.a. Anlegen von FConnection und Aufbauen der Verbindung
  FDSIDList := TADODataSet.Create(nil);
  FDSIDList.Connection := FConnection;
  FDSIDList.CommandText := 'SELECT * FROM Cards WHERE ID IN (:IDList)';
end;
Delphi-Quellcode:
function TmtgDatabase.GetDeckFromIDList(IDs: string): Integer;
// >> IDs   - Liste der auszulesenden IDs, durch Komma getrennt, zb "42,15,32"
// << Result - Anzahl der tatsächlich gelesenen Datensätze
begin
  Result := 0;

  FDSIDList.Parameters.ParamByName('IDList').Value := IDs;
  FDSIDList.Active := True;

  while not FDSIDList.Eof do begin
    [...] // Verarbeiten des aktuellen Datensatzes, vorerst noch über globale Variablen
    FDSIDList.Next;
    Inc(Result);
  end;
  FDSIDList.Active := False;
end;
Das Auslesen ist dabei nicht das Problem: Füge ich die ID-Liste direkt in die SQL-Anweisung ohne Parameter ein, so funktioniert es.

Meine Frage ist nun:
Was mache ich falsch? Wie gesagt: Ich bin gerade dabei, meine Kenntnisse zu verbessern und kenn mich noch nicht so gut aus ;)

Würde mich freuen, wenn mir jemand helfen kann,
MfG Zwoetzen

NormanNG 5. Jan 2009 12:34

Re: [ADO] Attribut IS IN (:Parameter) - Funktioniert nicht
 
Hi,

SQL-Code:
SELECT * FROM Cards WHERE ID IN (:IDList)
hierbei wird :IDList immer als eine (!) Stringvariablen geführt.
Für SQL hat die Menge für den IN-Vergleich damit immer nur ein Element (und zwar einen String/Varchar...).

Zwoetzen 5. Jan 2009 12:45

Re: [ADO] Attribut IS IN (:Parameter) - Funktioniert nicht
 
Aso... Dann ist es natürlich klar, warum es nicht geht.

Könnte man das irgendwie anders mit Parametern noch lösen, oder muss ich die ID-Liste direkt in das SQL-Statement einfügen?

nahpets 5. Jan 2009 13:00

Re: [ADO] Attribut IS IN (:Parameter) - Funktioniert nicht
 
Hallo,

mach's doch so:
Delphi-Quellcode:
  fCommandText : String; // Als Property der Klasse.

[...]
  // Im Konstruktor statt FDSIDList.CommandText := ...
  fCommandText := 'SELECT * FROM Cards WHERE ID IN (:IDList)';
[...]

  // FDSIDList.Parameters.ParamByName('IDList').Value := IDs;
  // stattdessen
  FDSIDList.CommandText := AnsiReplaceText(fCommandText,':IDList',IDs);

Zwoetzen 5. Jan 2009 14:22

Re: [ADO] Attribut IS IN (:Parameter) - Funktioniert nicht
 
Werd es wohl so machen, wie du es vorgeschlagen hast, nahpets.

Danke euch beiden für die Antworten 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 Uhr.

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