Query.Updatemode

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Query.Updatemode

Beitrag von Scotty »

Ich habe eine Benutzerverwaltung in einer mySQL 5.0, die laufend aktualisiert wird. Dabei kommt es zu dem unverständlichen Phänomen, dass die Werte bei neu hinzugefügten Spielern (Query.Append) nicht angepasst werden, ältere, die ich irgendwann mal aus einer ini-Datei übertragen hatte, aber mit dem gleichen Code funktionieren. Nun habe ich den Updatemode von upWhereAll auf upWhereChanged umgestellt und plötzlich ging es. Allerdings hat sich damit dann meine db zerstört: Query.Edit hat multiple Einträge erzeugt und irgendwann alle Zeilen überschrieben :cry:

Ich bin an jeder Kritik interessiert. Falls man etwas prinzipiell anders macht, dann bedenke ich das gern. Das Programm läuft als Server auf einem Sheeva-Plug, multithreaded für parallelen Zugriff; es gibt keine visuellen Komponenten.

Der Code sieht in etwa so aus:

Code: Alles auswählen

uses ...  Mysql50conn, sqldb, db,...
 
  MySQL := TMySQL50Connection.Create(nil);
  Trans := TSQLTransaction.Create(nil);
  with MySQL do
  begin
    HostName := '127.0.0.1';
    UserName := _user;
    Password := _passwd;
    DatabaseName := _database;
    Connected:=true;
    Transaction := Trans;
  end;
 
  Query := TSQLQuery.Create(nil);
  Query.DataBase := MySQL;
  Query.UpdateMode := upWhereChanged; //upWhereAll
  Query.SQL.Text := 'SET CHARACTER SET `utf8`';
  Query.ExecSQL;
 
  Query.Active:=false;
  Query.SQL.Text := 'SELECT * FROM Users WHERE Name="Test"';
  Query.Active:=true;
  Query.Edit;
  writeln('1:', Query.FieldValues['GamesPlayed']); //1
  Query.FieldValues['GamesPlayed']:=Query.FieldValues['GamesPlayed']+1;
  writeln('2:', Query.FieldValues['GamesPlayed']); //2
  Query.Post;
  Query.ApplyUpdates; 
  Trans.Commit;
 
  Query.Active:=false;
  Query.SQL.Text := 'SELECT * FROM Users WHERE Name="Test"';
  Query.Active:=true;
  writeln('3:', Query.FieldValues['GamesPlayed']); //2, wenn upWhereChanged, 1 wenn upWhereAll
 
  Query.Close;
 
  Query.Free;
  Trans.Free;
  MySQL.Free;
Ein neuer Eintrag wird so erstellt:

Code: Alles auswählen

Info.PlayerName:=aRecvMsg.Sender; //Benutzername kommt über TCP rein
  Query.Active:=false;
  Query.SQL.Text := 'SELECT * FROM Users WHERE Name="'+Info.PlayerName+'"';
  Query.Active:=true;
  if Query.RecordCount=0 then
  begin
     Query.Cancel;
     Query.Append;
     Query.FieldValues['Name'] := Info.PlayerName;
     Query.Post;
     Query.ApplyUpdates; //to apply update
  end;
  Query.Active:=false;
  Query.SQL.Text := 'SELECT * FROM Users WHERE Name="'+Info.PlayerName+'"';
  Query.Active:=true;

Antworten