Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Parameterübergabe (https://www.delphipraxis.net/48593-sql-parameteruebergabe.html)

Luciano 27. Jun 2005 21:49

Datenbank: MSDE • Version: SP3a • Zugriff über: dbGo / ADO

SQL Parameterübergabe
 
Hi,

ich habe folgendes Problem was ich nicht nachvollziehen kann. Über eine ADOQuery starte ich folgende Anfrage.
(SN ist ein Integerwert)

Delphi-Quellcode:
  if RadioButton1.Checked = True then
    begin
      with Q_SUCHE do
        begin
          Close;
          SQL.Clear;
          SQL.Add(' SELECT * FROM CKIII    ');
          SQL.Add('  WHERE SN LIKE :v_SUCHE ');
          Prepared := True;
          Parameters.ParamByName('v_SUCHE').Value := Edit1.Text+'%';
          Open;
        end;
    end;
Die Fehlermeldung lautet " Die Anwendung verwendet für den aktuellen Vorgang einen Wert vom falschen Typ "
Wie kann das sein? Ich glaube ich rate meinem Chef wieder zu Delphi 6!!!

Thx für jegliche Antworten!

Greets

Peppi999 27. Jun 2005 21:58

Re: SQL Parameterübergabe
 
Hi,

ich vermute mal, dass er dadurch, dass du noch ein % anhängst das ganze als string / varchar übergibt...
Da der Parameter ein Value ist, und sich den Datentyp "aussucht"...

ob man nauch nach ähnlichen Zahlen suchen kann / wie, weiß ich nicht...

wie gesagt ist nur eine vermutung

//edit: hast du mal ausprobiert, was passiert, wenn du das % wegnimmst?

Luciano 27. Jun 2005 22:43

Re: SQL Parameterübergabe
 
Hi,
wenn ich das '%' weg lasse geht es aber dann kann ich eben nicht wie gewünscht nach einem Teil der SN suchen. Deshalb eben
SQL-Code:
SN LIKE :v_SUCHE
Wenn ich das so mache geht es aber dann eben OHNE '%'
SQL-Code:
SN = :v_SUCHE
Die Anwendung kommt wirklich nicht mit der Übergabe "Edit1.Text+'%'" als VALUE zurecht, das hatte aber sonst mit Delphi6/7 immer gefunzt. Ist das jetzt ein neues feature von Delphi 2005???? Wenn ich mich schon mit so kleinigkeiten rumärgern muß wechsel ich wieder zu meinem guten "alten" Delphi.

Greets

marabu 28. Jun 2005 07:10

Re: SQL Parameterübergabe
 
Hallo Mike,

Zitat:

Zitat von Luciano
(SN ist ein Integerwert)

dann solltest du auch keine String-Operatoren verwenden. Du musst dich also entscheiden.

SQL-Code:
SELECT * FROM ckiii WHERE sn BETWEEN :low AND :high
SELECT * FROM ckiii WHERE CAST(sn AS CHAR) LIKE :prefix
Mit einem anderen Delphi erhältst du sicher die gleiche Fehlermeldung. Eine andere Datenbank könnte eventuell ein implizites type casting machen, aber darauf sollte man sich sowieso nicht verlassen.

Grüße vom marabu

MaBuSE 28. Jun 2005 07:53

Re: SQL Parameterübergabe
 
Zitat:

Zitat von Luciano
(SN ist ein Integerwert)
Delphi-Quellcode:
  if RadioButton1.Checked = True then
    begin
      with Q_SUCHE do
        begin
          Close;
          SQL.Clear;
          SQL.Add(' SELECT * FROM CKIII    ');
          SQL.Add('  WHERE SN LIKE :v_SUCHE ');
          Prepared := True;
          Parameters.ParamByName('v_SUCHE').Value := Edit1.Text+'%';
          Open;
        end;
    end;
Die Fehlermeldung lautet " Die Anwendung verwendet für den aktuellen Vorgang einen Wert vom falschen Typ "

Es gibt 2 Dinge die zu Deinem Problem führen.
  1. der SQL Befehl LIKE funktioniert nur mit Strings. Das steht in jedem SQL Buch. Dieser Operand vergleicht Zeichenfolgen mit Wildcards (%).
  2. Wenn SN in der Datenbank ein String ist, dann sollte der Parameter auch auf String eingestellt werden.
    Delphi-Quellcode:
    ...
      // Beispiel mit Tabelle CLients aus DBDEMOS (TQuery aus BDE Pallette verwendet)
      with query1 do
      begin
        sql.Text := 'select * from clients where last_name like :last_name;';

        Params.ParamByName('last_name').ParamType := ptInput;

        // Params.ParamByName('last_name').DataType := ftString;      // <-- wichtig !
        // Params.ParamByName('last_name').Value := Edit1.Text + '%';

        // oder besser
        // Mit AsString zuweisen um DataType auf ftString automatisch zu setzen
        Params.ParamByName('last_name').AsString := Edit1.Text + '%';

        Open;
      end;
    ...
    wenn SN in der Datenbank Integer ist könnte man das so lösen:
    Delphi-Quellcode:
    ...
      if RadioButton1.Checked = True then
        begin
          with Q_SUCHE do
            begin
              Close;
              SQL.Clear;
              SQL.Add(' SELECT * FROM CKIII    ');
              SQL.Add('  WHERE SN > :v_SUCHE '); // kein LIKE, sondern =, >, =>, < und <=
              Prepared := True;
              Parameters.ParamByName('v_SUCHE').ParamType := ptInput;
              Parameters.ParamByName('v_SUCHE').DataType := ftInteger;
              Parameters.ParamByName('v_SUCHE').Value := StrToInt(Edit1.Text);

              Parameters.ParamByName('v_SUCHE').AsInteger := StrToInt(Edit1.Text);
              Open;
            end;
        end;
    ...
Zitat:

Zitat von Luciano
Wie kann das sein? Ich glaube ich rate meinem Chef wieder zu Delphi 6!!!

:?: Wieso das ? IN Delphi 6 hast Du das gleiche Problem.

Luciano 28. Jun 2005 08:08

Re: SQL Parameterübergabe
 
Hi,
Erstmal vielen Dank für die Antworten, leider komme ich heute nicht mehr dazu mich mit diesem Problem zu befassen und muß das ganze auf heute Abend verschieben. Ich werde eure Ansätze testen und versuchen das "irgendwie" umzusetzten. Mein Ergebnis bekommt ihr dann später :thumb:

Greets

MaBuSE 28. Jun 2005 08:08

Re: SQL Parameterübergabe
 
Zitat:

Zitat von Luciano
wenn ich das '%' weg lasse geht es aber dann kann ich eben nicht wie gewünscht nach einem Teil der SN suchen. Deshalb eben
SQL-Code:
SN LIKE :v_SUCHE
Wenn ich das so mache geht es aber dann eben OHNE '%'
SQL-Code:
SN = :v_SUCHE

Wenn SN ein INteger ist funktioniert das auch nicht in Delphi 1,2,3,4,5,6,7 und 8 !
Es funktioniert auch nicht in C++ oder C# !
Das ist eine Regel von SQL, also der Datenbank.

Zitat:

Zitat von Luciano
Die Anwendung kommt wirklich nicht mit der Übergabe "Edit1.Text+'%'" als VALUE zurecht, das hatte aber sonst mit Delphi6/7 immer gefunzt. Ist das jetzt ein neues feature von Delphi 2005???? Wenn ich mich schon mit so kleinigkeiten rumärgern muß wechsel ich wieder zu meinem guten "alten" Delphi.

Bei Strings ja, bei Integer nein.

Es macht ja bei Integer auch keinen Sinn

Code:
Wert
1
2
3
...
10
11
12
...
100
101
...
10845180471
ein Wert LIKE "1%" würde folgede Zahlen auswählen:
Code:
Wert
1
10
11
12
100
101
10845180471
Wenn Du diese Zahlen wirklich so auswählen willst mach aus dem SN einen VARCHAR (String) in der Datenbank.
oder verwende die Operatoren für Zahlen: =, >, <, ...
z.B. Wert < 11 gibt folgendes zurück
Code:
Wert
1
2
3
...
10

Luciano 29. Jun 2005 08:36

Re: SQL Parameterübergabe
 
Hi MaBuSE,

ich muß dir vollkommen recht geben. In meinem übereifer habe ich mal wieder völlig das Nachdenken vergessen. Da es ein Integerwert ist geht das so ja gar nicht :wall: deshalb als String und alle sind glücklich. Danke für deine Antworten!!!

Greets

MaBuSE 29. Jun 2005 08:39

Re: SQL Parameterübergabe
 
Zitat:

Zitat von Luciano
Da es ein Integerwert ist geht das so ja gar nicht :wall: deshalb als String und alle sind glücklich.

:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:26 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