![]() |
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:
aber nicht sowas:
INSERT INTO mytbl VALUES(?,?,?)
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 |
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. |
AW: MySQL und BindParam
Hallo Himitsu,
SQLite scheint da schon etwas weiter zu sein. ![]() 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 |
AW: MySQL und BindParam
Zitat:
|
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.
|
AW: MySQL und BindParam
Die Zugriffkomponeten mappen in diesem Fall dann die Namen
|
AW: MySQL und BindParam
Zitat:
mysqli dagegen nur das "?" (MySQLi ist aber auch nur eine Klasse, welche fast direkt die API der libmysql.dll umsetzt) |
AW: MySQL und BindParam
Zitat:
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 ![]()
Delphi-Quellcode:
Längen und Adressen stimmen, aber in der DB landet nur das erste Zeichen vom String. :?: Stehe seit einer Stunde anscheinend auf der Leitung.
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; Grüße, Uwe |
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. |
AW: MySQL und BindParam
Zitat:
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:48 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