Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MySQL und BindParam (https://www.delphipraxis.net/153558-mysql-und-bindparam.html)

Schorschi5566 8. Aug 2010 10:24

Datenbank: MySQL • Version: ab 5.1 • Zugriff über: egal

MySQL und BindParam
 
Hallo DP,

sehe ich das richtig, dass MySQL derzeit nur sowas kann:

Code:
INSERT INTO mytbl VALUES(?,?,?)
aber nicht sowas:

Code:
INSERT INTO mytbl VALUES(:var1,:var2,:var3)

Finde nichts Entsprechendes in der Doku. Wäre ja schon etwas schwach. Die Fragezeichennotation ist ja auch nicht gerade lesbarer als bisheriger Code mit mysql_query. :roll:


Grüße,
Uwe

himitsu 8. Aug 2010 10:31

AW: MySQL und BindParam
 
MySQL kennt standardmäßig anscheinend nur das ?.
Dieses :Name wird wohl in einigen Fällen über den Klienten gelöst.

Drum hab ich mir da Einiges in meiner PHP-MySQL-Klasse gebastelt, welches da Ähnliches bietet.

Schorschi5566 8. Aug 2010 10:39

AW: MySQL und BindParam
 
Hallo Himitsu,

SQLite scheint da schon etwas weiter zu sein.

Hier zu sehen...

Na ja, mal sehen, wie man das etwas schöner hinbekommt. Ohne die Variablennamen im Statement hat das, meiner Meinung nach, wenig Sinn.


Grüße,
Uwe

mkinzler 8. Aug 2010 10:44

AW: MySQL und BindParam
 
Zitat:

SQLite scheint da schon etwas weiter zu sein.
Und andere DBMS auch.:zwinker:

Bernhard Geyer 8. Aug 2010 13:43

AW: MySQL und BindParam
 
Die Syntax hängt vom Zugriffsweg ab. Bei ADO/ADO.NET/JDBC wird die "?"-Syntax verwendet. Bei TDataSet-Kompatiblen KOmpos (z.b. von DevArt) die :varXX-Syntax.

mkinzler 8. Aug 2010 13:49

AW: MySQL und BindParam
 
Die Zugriffkomponeten mappen in diesem Fall dann die Namen

himitsu 8. Aug 2010 14:05

AW: MySQL und BindParam
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1040248)
Bei ADO/ADO.NET/JDBC wird die "?"-Syntax verwendet.

Das ADO in PHP nutzt auch die ":Name"-Syntax.
mysqli dagegen nur das "?" (MySQLi ist aber auch nur eine Klasse, welche fast direkt die API der libmysql.dll umsetzt)

Schorschi5566 8. Aug 2010 15:18

AW: MySQL und BindParam
 
Zitat:

"?"-Syntax
"?"-Kryptografie trifft's, finde ich, besser. Wer lässt sich solchen Schmarrn einfallen? :?

Ok, für SQL-Einzeiler vielleicht bedingt geeignet. :-D

@Himitsu: Hast Du damit schon was in MySQL gemacht? Ich versuche gerade das Beispiel aus der MySQL-Doku nachzuvollziehen und scheitere am String-Typ. :stupid:

Delphi-Quellcode:
function TMysqlClient.query(const bquery: string; const Args: array of const;
  StoreResult: boolean; var ExecutedOk: boolean): TMysqlResult;
var
  i, j, iRc: Integer;
  aquery : AnsiString;
  sLen : Cardinal;
  sDummy : String;
  fVar : Double;
begin
  // Bind Param
  aquery := ansistring(bquery);
  fstmt := mysql_stmt_init(fHandle);
  if fstmt <> nil then
  begin
    iRc := mysql_stmt_prepare(fstmt, @aquery[1], Length(aquery));
    if iRc = 0 then
    begin
      ShowMessage(IntToStr(mysql_stmt_param_count(fstmt)));
      SetLength(fbinding, length(Args));
      for i := 0 to length(Args) - 1 do
      begin
        fbinding[i].is_null := 0;
        fbinding[i].length := 0;

        case Args[i].VType of
          vtInteger:
          begin
            fbinding[i].buffer_type := MYSQL_TYPE_LONG;
            fbinding[i].buffer := @Args[i];
          end;
          vtString, vtAnsiString, vtUnicodeString:
          begin
            fbinding[i].buffer_type := MYSQL_TYPE_STRING;
            sDummy := String(Args[i].VUnicodeString);
            sLen := Length(sDummy);
            fbinding[i].buffer_length := sLen;
            fbinding[i].buffer := Pointer(sDummy);
            fbinding[i].length := @sLen;
          end;
          vtExtended:
          begin
            fbinding[i].buffer_type := MYSQL_TYPE_DOUBLE;
            sLen := sizeof(Double);
            fVar := Args[i].VExtended^;
            fbinding[i].buffer_length := sLen;
            fbinding[i].buffer := @fVar;
            fbinding[i].length := @sLen;
          end;
        end;
      end;
      if (not mysql_stmt_bind_param(fstmt, fbinding)) then
      begin
        if mysql_stmt_execute(fstmt) = 0 then
        begin
          ShowMessage(IntToStr(mysql_stmt_affected_rows(fstmt)));
        end;
      end;
    end
    else
      ShowMessage(mysql_stmt_error(fstmt));
  end;
end;
Längen und Adressen stimmen, aber in der DB landet nur das erste Zeichen vom String. :?: Stehe seit einer Stunde anscheinend auf der Leitung.

Grüße,
Uwe

himitsu 8. Aug 2010 15:47

AW: MySQL und BindParam
 
Nun, erstmal würde ich statt String einen AnsiString oder besser noch einen RawByteString verwenden.

Ich versuch es demnächst mal mit einem UTF8String, der automatischen Stringumwandlung (über das kranke StringChecking) und einem auf UTF8 eingestellten MySQL-Clienten.
(da sollte man dann theoretisch einen String/UnicodeString übergeben können und Delphi wandelt das automatisch auf UTF-8 um)



Eine manuelle Umwandlung von :Name auf ? sollte auch nicht schwer sein und sich relativ flott implementieren lassen.

Bernhard Geyer 8. Aug 2010 15:49

AW: MySQL und BindParam
 
Zitat:

Zitat von Schorschi5566 (Beitrag 1040259)
"?"-Kryptografie trifft's, finde ich, besser. Wer lässt sich solchen Schmarrn einfallen? :?

Microsoft, Sun, ....

Bei entsprechender Programmierung ist diese Syntax "schnurzpiepegal". Wir selbst verwenden in unserer DB-Unabhängigen Zugriffskompos beider Art. Außerhalb der DB-Schnittstellenunit nach Bridge-Pattern-Art ist der Unterschied nicht mehr vorhanden.


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