bestlong 怕失憶論壇
標題:
利用GUID來做資料庫應用程式的用戶端連線列表
[打印本頁]
作者:
bestlong
時間:
2010-7-23 16:18
標題:
利用GUID來做資料庫應用程式的用戶端連線列表
AppSessionTimer: TTimer;
procedure TMainForm.AppSessionInit;
begin
try
qyTemp.Close;
qyTemp.SQL.Clear;
qyTemp.SQL.Add('select GUID=Convert(VarChar(36),newID())');
qyTemp.Open;
SessionGUID := qyTemp.FieldByName('GUID').AsString;
qyTemp.Close;
qyTemp.SQL.Clear;
qyTemp.SQL.Add('select * from SESSION where GUID=:GUID');
qyTemp.ParamByName('GUID').AsString := SessionGUID;
qyTemp.RequestLive := true;
qyTemp.Open;
if qyTemp.IsEmpty then
begin
qyTemp.Insert;
qyTemp.FieldByName('GUID').AsString := SessionGUID;
qyTemp.FieldByName('STARTTIME').AsDateTime := gsStartTime;
qyTemp.FieldByName('LASTTIME').AsDateTime := now;
qyTemp.FieldByName('HOSTNAME').AsString := GetPCName;
qyTemp.FieldByName('USERID').AsString := '';
qyTemp.FieldByName('USERNAME').AsString := '';
qyTemp.Post;
end else begin
MyMsg('資料庫 SESSION_GUID 問題請重新連線');
Self.Close;
end;
qyTemp.Close;
qyTemp.RequestLive := False;
except
end;
end;
procedure TMainForm.AppSessionUpdateUser;
begin
try
qyTemp.SQL.Clear;
qyTemp.SQL.Add('update SESSION set USERNAME = :USERNAME,USERID = :USERID where GUID=:GUID');
qyTemp.ParamByName('GUID').AsString := SessionGUID;
qyTemp.ParamByName('USERID').AsString := gsUser_num;
qyTemp.ParamByName('USERNAME').AsString := gsUser_nam;
qyTemp.ExecSQL;
except
end;
end;
procedure TMainForm.AppSessionUpdateLastTime;
begin
try
qyTemp.SQL.Clear;
qyTemp.SQL.Add('update SESSION set LASTTIME = :LASTTIME where GUID=:GUID');
qyTemp.ParamByName('GUID').AsString := SessionGUID;
qyTemp.ParamByName('LASTTIME').AsDateTime := Now;
qyTemp.ExecSQL;
except
end;
end;
procedure TMainForm.AppSessionClear;
begin
try
qyTemp.SQL.Clear;
qyTemp.SQL.Add('delete from SESSION');
qyTemp.SQL.Add('where LASTTIME is null ');
qyTemp.SQL.Add(' or (datediff(minute,LASTTIME,getDate())>5)');
qyTemp.SQL.Add(' or (GUID=:GUID)');
qyTemp.ParamByName('GUID').AsString := SessionGUID;
qyTemp.ExecSQL;
except
end;
end;
procedure TMainForm.FormShow(Sender: TObject);
begin
AppSessionInit;
AppSessionTimer.Interval := 1000 * 60 * 2;
AppSessionTimer.Enabled := true;
end;
procedure TMainForm.FormActivate(Sender: TObject);
begin
AppSessionUpdateUser;
end;
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
AppSessionClear;
end;
procedure TMainForm.AppSessionTimerTimer(Sender: TObject);
begin
AppSessionUpdateLastTime;
end;
複製代碼
資料表 Schema
CREATE TABLE [dbo].[SESSION] (
[GUID] [char] (36) NOT NULL ,
[STARTTIME] [datetime] NOT NULL ,
[LASTTIME] [datetime] NOT NULL ,
[HOSTNAME] [varchar] (15) NULL ,
[USERID] [varchar] (15) NULL ,
[USERNAME] [varchar] (15) NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[SESSION] ADD
CONSTRAINT [PK_SESSION] PRIMARY KEY CLUSTERED
(
[GUID]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO
複製代碼
歡迎光臨 bestlong 怕失憶論壇 (http://www.bestlong.idv.tw/)
Powered by Discuz! X1.5