![]() |
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:
Nun bekomme ich aber folgendes Verhalten:
SELECT * FROM Test WHERE ID IN (:IDList)
* 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:
Das Auslesen ist dabei nicht das Problem: Füge ich die ID-Liste direkt in die SQL-Anweisung ohne Parameter ein, so funktioniert es.
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; 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 |
Re: [ADO] Attribut IS IN (:Parameter) - Funktioniert nicht
Hi,
SQL-Code:
hierbei wird :IDList immer als eine (!) Stringvariablen geführt.
SELECT * FROM Cards WHERE ID IN (:IDList)
Für SQL hat die Menge für den IN-Vergleich damit immer nur ein Element (und zwar einen String/Varchar...). |
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? |
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); |
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 07:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz