Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Query mit Parameterübergabe und Sonderzeichen im Wert (https://www.delphipraxis.net/165579-query-mit-parameteruebergabe-und-sonderzeichen-im-wert.html)

Moony 6. Jan 2012 13:39

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:
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;
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?

Danke & Gruß,
Moony

Bernhard Geyer 6. Jan 2012 13:42

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.

Moony 6. Jan 2012 13:47

AW: Query mit Parameterübergabe und Sonderzeichen im Wert
 
Nee, das ist ein nvarchar.

Sir Rufo 6. Jan 2012 14:04

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:
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;
warum so ... weil dann auch das hier möglich ist:
Code:
SELECT * FROM foo WHERE name1 LIKE :Parameter OR name2 LIKE :Parameter
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.

Wenn der Wert also irgendwie in dem Feld auftauchen soll, dann musst du also so vergleichen lassen:
Code:
SELECT * FROM foo WHERE name1 LIKE "%Müller%"
Mein Beispiel damit erweitert würde dann wie folgt aussehen:
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;

Moony 6. Jan 2012 14:16

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.

DeddyH 6. Jan 2012 14:19

AW: Query mit Parameterübergabe und Sonderzeichen im Wert
 
Kannst Du nicht am SQL-Server nachschauen, welcher Querystring da tatsächlich ankommt?

Moony 6. Jan 2012 14:39

AW: Query mit Parameterübergabe und Sonderzeichen im Wert
 
wie mache ich das?

DeddyH 6. Jan 2012 14:42

AW: Query mit Parameterübergabe und Sonderzeichen im Wert
 
Aktivitätsmonitor im Management Studio.

Moony 9. Jan 2012 14:23

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

RWarnecke 9. Jan 2012 16:36

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 21:19 Uhr.
Seite 1 von 2  1 2      

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