AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

MySQL und BindParam

Ein Thema von Schorschi5566 · begonnen am 8. Aug 2010 · letzter Beitrag vom 9. Aug 2010
Antwort Antwort
Seite 1 von 2  1 2      
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

MySQL und BindParam

  Alt 8. Aug 2010, 11:24
Datenbank: MySQL • Version: ab 5.1 • Zugriff über: egal
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.


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.074 Beiträge
 
Delphi 12 Athens
 
#2

AW: MySQL und BindParam

  Alt 8. Aug 2010, 11:31
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: MySQL und BindParam

  Alt 8. Aug 2010, 11:39
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
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: MySQL und BindParam

  Alt 8. Aug 2010, 11:44
Zitat:
SQLite scheint da schon etwas weiter zu sein.
Und andere DBMS auch.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: MySQL und BindParam

  Alt 8. Aug 2010, 14:43
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: MySQL und BindParam

  Alt 8. Aug 2010, 14:49
Die Zugriffkomponeten mappen in diesem Fall dann die Namen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.074 Beiträge
 
Delphi 12 Athens
 
#7

AW: MySQL und BindParam

  Alt 8. Aug 2010, 15:05
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Schorschi5566

Registriert seit: 6. Feb 2006
197 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#8

AW: MySQL und BindParam

  Alt 8. Aug 2010, 16:18
Zitat:
"?"-Syntax
"?"-Kryptografie trifft's, finde ich, besser. Wer lässt sich solchen Schmarrn einfallen?

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

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

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
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.074 Beiträge
 
Delphi 12 Athens
 
#9

AW: MySQL und BindParam

  Alt 8. Aug 2010, 16:47
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Aug 2010 um 16:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.197 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: MySQL und BindParam

  Alt 8. Aug 2010, 16:49
"?"-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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 Uhr.
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