2011-02-16 112 views
1

我正在使用VCL TCPServer組件,該組件每次在TCP端口上接收到數據時都會觸發事件 。在事件數據可用的文本 參數的過程。因爲我想將這些數據保存到mysql數據庫中,所以我想知道哪個是最好的解決方法。 直接在過程中爲每個接收的數據使用INSERT SQL命令 或將數據存儲在內存中(即TStrings),然後每隔X(使用Timer)分鐘調用 函數執行INSERT命令?將tcp數據保存到表數據庫中

感謝

+0

可能重複://計算器.com/questions/5015473/when-perform-sql-insert) – jachguate 2011-02-22 16:50:12

回答

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

的[當執行SQL INSERT?](HTTP
+0

你能告訴我一個例子嗎? :( – marcostT 2011-03-25 12:57:17