Einzelnen Beitrag anzeigen

Zwoetzen

Registriert seit: 19. Sep 2007
Ort: Ilmenau
93 Beiträge
 
Delphi 2009 Professional
 
#1

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

  Alt 5. Jan 2009, 12:30
Datenbank: MSAccess • Zugriff über: ADO
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:

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
  Mit Zitat antworten Zitat