将tcp数据保存到表数据库中

时间:2011-02-16 09:05:15

标签: delphi delphi-2009

我正在使用VCL TCPServer组件,每次数据都会触发事件 在tcp端口上收到。在事件内,数据可用于文本 程序的参数。因为我想将这些数据保存到mysql中 数据库我想知道哪个是解决这个问题的最佳方法。 在过程中直接对收到的每个数据使用INSERT SQL命令 或者将数据存储在存储器(即TStrings)中然后调用 一个函数每X(使用Timer)分钟执行INSERT命令?

由于

1 个答案:

答案 0 :(得分:1)

那么,

您不应该在事件中保存数据,因为在执行此操作时您将破坏组件执行流程。代替:

1 - 您可以缓冲要保存的所有数据,并且不时保存它们(不好,如果您的应用程序出现问题,您可能会丢失大量数据)。

2 - 在事件内部,创建一个将接收数据并将其保存到数据库的线程。这样您就不会破坏事件流程执行,并且您将动态保存所有数据。如果您这样做,您还将使用CPU的另一个核心。这就是我要做的。

解决方案2的代码(未经测试):

TOnError = procedure(aError : string) of object;

TSaveDataThread = class(TThread)
private
  oError : string;
  oOnError : TOnError;
  oDataToSave : string;
  procedure SaveDataToDataBase;
  procedure CallOnError;
protected
  procedure Execute; override;
  constructor Create(aDataToSave : string); reintroduce;
public
  property OnError : TOnError read oOnError write oOnError;
end;

procedure TSaveDataThread.CallOnError;
begin
  oOnError(oError);
end;

constructor TSaveDataThread.Create(aDataToSave: string);
begin
  inherited Create(True);
  FreeOnTerminate := True;
  oDataToSave := aDataToSave;
end;

procedure TSaveDataThread.Execute;
begin
  inherited;
  Self.SaveDataToDataBase;
end;

procedure TSaveDataThread.SaveDataToDataBase;
begin
  //put here your code to save aDataToSave to the database
  //set error on oError
  oError := 'error';
  Synchronize(CallOnError);
end;

procedure TForm5.OnError(aError: string);
begin
  ShowMessage(aError);
end;

procedure TForm5.Button1Click(Sender: TObject);
var
  vSaveDataThread : TSaveDataThread;
  vDataToSave : string;
begin
  //change this method fot the event you want to use
  vDataToSave := 'this is the data that will be saved to the database';
  vSaveDataThread := TSaveDataThread.Create(vDataToSave);
  vSaveDataThread.OnError := Self.OnError;
  vSaveDataThread.Start;
end;

如果您不了解线程,请查看此问题:Multithreading - The Delphi Way

相关问题