![]() |
Datenbank: MS SQL • Version: 2005/2008 • Zugriff über: UniDAC
Query mit Parameterübergabe und Sonderzeichen im Wert
Hallo zusammen,
ich baue in meinem Tool ein Query mit Parameterübergabe zusammen. Beispiel:
Delphi-Quellcode:
SELECT * FROM Personen WHERE ([Name] LIKE :fltprm_1)
Bevor das Query abgesendet wird, werden die Werte für die Parameter gefüllt mit:
Delphi-Quellcode:
In der ParamValuesLst können Werte stehen wie 'Müller'. Wenn der SQL BEfehl ausgeführt wird, dann bekomme ich keinerlei Ergebnisse. Ich schätze mal dass wegen der Sonderzeichen - in diesem Fall Umlaut - nichts gefunden wird. Habe bereits versucht beim Füllen von ParamByName den Wert in QuotedStr() bzw. in Hochkommata zu setzen. Aber auch hier kein Ergebnis. Gibts da noch eine andere Lösung?
for i := 0 to ParamFieldsLst.Count - 1 do
begin if myDS.FindParam(ParamFieldsLst.Strings[i]) <> nil then myDS.ParamByName(ParamFieldsLst.Strings[i]).Value := Variant(ParamValuesLst.Strings[i]); end; Danke & Gruß, Moony |
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
welchen SQL-Typ hat dein Feld? ich hoffe doch nvarchar.
Sollte es nur varchar sein könnte hier die schön öfter selbst bemerkten Probleme zuschlagen wenn man versucht mit einem Unicode-String mit einem Ansi-Feld beim MS-SQL-Server zu arbeiten. |
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Nee, das ist ein nvarchar.
|
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Also zum einen würde ich so schon mal nicht durch die Parameter iterieren ;)
Besser so:
Delphi-Quellcode:
warum so ... weil dann auch das hier möglich ist:
var
ParamName : string; ParamIdx : integer; ParamValue : string; for i := 0 to myDS.ParamCount - 1 do begin ParamName := myDS.Params[ i ].Name; ParamIdx := ParamFieldsLst.IndexOf( ParamName ); if ( ParamIdx >= 0 ) and ( ParamIdx < ParamValuesLst.Count ) then begin ParamValue := ParamValuesLst[ ParamIdx ]; myDS.Params[ i }.Value := ParamValue; end else myDS.Params[ i ].Clear; end;
Code:
Für die Suche mit LIKE müsstest du aber auch die Joker % oder _ verwenden, oder du bekommst nur 100% übereinstimmende Treffer. Auch dieses kann ein Grund dafür sein, dass du keine Treffer bekommst.
SELECT * FROM foo WHERE name1 LIKE :Parameter OR name2 LIKE :Parameter
Wenn der Wert also irgendwie in dem Feld auftauchen soll, dann musst du also so vergleichen lassen:
Code:
Mein Beispiel damit erweitert würde dann wie folgt aussehen:
SELECT * FROM foo WHERE name1 LIKE "%Müller%"
Delphi-Quellcode:
var
ParamName : string; ParamIdx : integer; ParamValue : string; for i := 0 to myDS.ParamCount - 1 do begin ParamName := myDS.Params[ i ].Name; ParamIdx := ParamFieldsLst.IndexOf( ParamName ); if ( ParamIdx >= 0 ) and ( ParamIdx < ParamValuesLst.Count ) then begin ParamValue := ParamValuesLst[ ParamIdx ]; myDS.Params[ i }.Value := '%' + ParamValue + '%'; end else myDS.Params[ i ].Clear; end; |
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Den Umbau kann man so auch machen. Was den Wert betrifft, der übergeben wird, sieht immer folgendermaßen aus 'Müller%'. Heißt in meiner Stringliste sind die Werte bereits mit dem Platzhalter versehen.
|
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Kannst Du nicht am SQL-Server nachschauen, welcher Querystring da tatsächlich ankommt?
|
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
wie mache ich das?
|
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Aktivitätsmonitor im Management Studio.
|
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Habe den Aktivitätsmonitor gestartet und im Debugmodus von meinem Tool Schritt für Schritt geprüft was passiert. Der Monitor zeigt nicht die Befehle an, die ich ausführe.
Zu erwähnen wäre noch, dass ich einen SQL Befehl als erstes in eine temporäre Tabelle absetze und anschließend SELECT * FROM #TempTable mit der Bedigung auf diese absetze. Habe jetzt im Monitor gesehen, dass er zwar den Befehl für das Schreiben der Temptabelle anzeigt, aber nicht meine anschließende Anfrage. Habe des weiteren für mein Tool über den SQL Server Profiler meine Befehle tracen lassen. und folgende Ergebnisse erhalten:
Delphi-Quellcode:
exec sp_executesql N'SELECT * FROM #tempPDF WHERE ([Name] LIKE @P1) ORDER BY Name,Vorname,Datum,Uhrzeit,Ausweisnummer',N'@P1 varchar(8000)','''LÖKER%'''
Gruß, Moony |
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Nehme doch mal eine Kopie Deines zusammengesetzten SQL-Befehls aus Deinem Programm und führe diesen direkt über ein bestehendes Programm aus, welches einwandfrei mit der Datenbank funktioniert. Sowas wie IBExpert für MS SQL. Ich mache das gleiche bei Firebird und habe dadurch schon so manchen Fehler gefunden.
|
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Also:
1. Ich schreibe einen vorgefertigten SQL Befehl in eine temporäre Tabelle mit
Code:
SELECT t.* INTO #tempTable FROM (mein SQL Befehl) AS t
2. Anschließend wird folgender Befehl meinem UniQuery zugewiesen:
Code:
Gibt es noch eine Bedingung oder eine Sortierung wird diese hier an den SQL Befehl gehangen. In meinem Fall gibt es beides. Das ist der Befehl so wie er an das Query geschickt wird mit:
SELECT * FROM #tempTable WHERE ([Name] LIKE :fltprm_1) ORDER BY Name,Vorname,Datum,Uhrzeit,Ausweisnummer
Delphi-Quellcode:
myDS.SQL.Text := SQL
3. Dann werden anhand einer Parameterliste die Werte dem Query zugewiesen mit Hilfe von:
Delphi-Quellcode:
Die Listen wurde vorher gefüllt und auf Konsistenz geprüft.
for i := 0 to ParamFieldsLst.Count - 1 do
begin if myDS.FindParam(ParamFieldsLst.Strings[i]) <> nil then myDS.ParamByName(ParamFieldsLst.Strings[i]).Value := Variant(ParamValuesLst.Strings[i]); end; 4. Öffnen des Queries mit:
Delphi-Quellcode:
myDS.Open;
Habe anschließend beide Querys im SQL Management Studio ausgeführt. |
AW: Query mit Parameterübergabe und Sonderzeichen im Wert
Ich habe es jetzt anders gelöst:
Anstatt mit Parameterübergabe mache ich folgende Schritte: 1. Anhand der Parameterliste für jeden Parameter eine Variablendeklaration ins Query laden mit: myDS.SQL.Add(). 2. Anschließend anhand der Parameterliste die Variablen mit Werten füllen. 3. Den SQL Befehl hinzufügen, der sowieso bereits schon in das Query geladen wurde. Somit werden alle Suchanfragen (egal ob String, Integer oder Datumsfelder) erfolgreich ausgeführt. Dennoch vielen Dank an alle die mitgewirkt haben. Gruß, Moony |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:52 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-2025 by Thomas Breitkreuz