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

Delphi 将tcp数据保存到表数据库中,delphi,delphi-2009,Delphi,Delphi 2009,我使用的是一个VCL TCPServer组件,它在每次发送数据时都会触发事件 在tcp端口上接收。在事件中,数据可转换为文本 程序的参数。因为我想把这些数据保存到mysql中 我想知道解决这个问题的最佳方法是什么。 对于接收到的每个数据,直接在过程中使用INSERT SQL命令 或者将数据存储在内存中(即TStrings),然后调用 每X(使用计时器)分钟执行一次INSERT命令的函数 谢谢好的 您不应该将数据保存在事件中,因为这样做会破坏组件执行流。相反: 1-你可以缓冲所有你想保存的数据,并

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

谢谢

好的

您不应该将数据保存在事件中,因为这样做会破坏组件执行流。相反:

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;
如果您不了解线程,请查看此项:

您不应该将数据保存在事件中,因为这样做会破坏组件执行流。相反:

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;

如果您不知道线程,请查看此项:

可能重复的可能重复的是,我可以。您想要哪种解决方案作为示例?1或2?是的,我能。您想要哪种解决方案作为示例?1或2。。。也许两者都有?:)我会尽力的,但我现在有点忙。解决方案1需要模式代码,您可能会丢失数据,我不建议这样做。如果我在事件中使用按钮1单击代码(为收到的每个数据包触发的代码),将创建一个线程,然后销毁。如果我收到很多包怎么办?太多的线程将被午餐…是的,我可以。您想要哪种解决方案作为示例?1或2?是的,我能。您想要哪种解决方案作为示例?1或2。。。也许两者都有?:)我会尽力的,但我现在有点忙。解决方案1需要模式代码,您可能会丢失数据,我不建议这样做。如果我在事件中使用按钮1单击代码(为收到的每个数据包触发的代码),将创建一个线程,然后销毁。如果我收到很多包怎么办?太多的线程将被午餐。。。。