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
Schorschi5566

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

AW: MySQL und BindParam

  Alt 8. Aug 2010, 15: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

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

AW: MySQL und BindParam

  Alt 8. Aug 2010, 15: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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 8. Aug 2010 um 15:50 Uhr)
  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, 15:56
Danke, jetzt klappt's.

Kann man den Typ String deinstallieren?
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks
  Mit Zitat antworten Zitat
Schorschi5566

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

AW: MySQL und BindParam

  Alt 9. Aug 2010, 18:25
Hallo Bernhard,

Zitat von Bernhard:
Bei entsprechender Programmierung ist diese Syntax "schnurzpiepegal".

Die ?-Notation hat auf jeden Fall den Nachteil, dass man eine Variable im SQL-Statement nicht mehrfach referenzieren kann. Außer man übergibt sie auch mehrfach, was ziemlich blöd aussieht.

Außerdem liest es sich einfach schlecht, wenn nur Fragezeichen dort stehen, wo eigentlich Namen sein sollten.

Die Variablenausgabe mit Binding finde ich aber recht nett.

Delphi-Quellcode:
type
  TDataRec = class
    id : Integer;
    col1 : Integer;
    col2 : String;
    col3 : Integer;
    col4 : Double;
    col5 : String;
  end;

.
.
.

procedure TfrmBindParam.btnStdQueryClick(Sender: TObject);
var
  sqlres : TMysqlResult;
  bEx: Boolean;
  iVar: Integer;
begin
  // normale Query ohne Statement und Bind
  if sql.Connected then
  begin
    csgTest.Clear;
    iVar := 1000;
    sqlres := sql.query('SELECT * FROM test_table ' +
                        'WHERE col3 = ''' + IntToStr(iVar) + '''', True, bEx);
    if bEx then
    begin
      with sqlres do
      begin
        First;
        while not Eof do
        begin
          di.id := FieldByName('id').AsInteger;
          di.col1 := FieldByName('col1').AsInteger;
          di.col2 := FieldByName('col2').AsString;
          di.col3 := FieldByName('col3').AsInteger;
          di.col4 := FieldByName('col4').AsDateTime;
          di.col5 := FieldByName('col5').AsString;
          csgTest.Add(di);
          Next;
        end;
        Free;
      end;
    end;
  end;
end;

procedure TfrmBindParam.btnBindQueryClick(Sender: TObject);
var
  sqlRes : TMysqlResult;
  bEx: Boolean;
  iVar: Integer;
begin
  // Query mit Statement und Bind
  if sql.Connected then
  begin
    csgTest.Clear;
    iVar := 1000;
    // Query befüllt das Dateninterface di automatisch.
    sqlRes := sql.query('SELECT * FROM test_table ' +
                        'WHERE col3 = ?', [iVar], di, True, bEx);
    if bEx then
    begin
      with sqlres do
      begin
        First; // holt erste Zeile in di
        while not Eof do
        begin
          csgTest.Add(di);
          Next; // holt nächste Zeile in di
        end;
        csgTest.List.SaveToFile('test.txt');
        Free;
      end;
    end;
  end;
end;

Ich versuche gerade die :Name-Notation einzubauen, was mal wieder an "array of const" scheitert. Schon schade, dass man auf die Variablennamen nicht zugreifen kann, dann wäre es recht einfach.


Grüße,
Uwe
Uwe
"Real programmers can write assembly code in any language." - Larry Wall
Delphi programming rocks

Geändert von Schorschi5566 ( 9. Aug 2010 um 18:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

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

AW: MySQL und BindParam

  Alt 8. Aug 2010, 15: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


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:30 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