![]() |
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:15 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