Einzelnen Beitrag anzeigen

Schorschi5566

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

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