对於delphi数据库开发者来说这是一个很重要的问题(请高手作答)(80分)

  • 主题发起人 主题发起人 playxiong
  • 开始时间 开始时间
P

playxiong

Unregistered / Unconfirmed
GUEST, unregistred user!
如何产生一个日志文件,用来检视使用者对数据库的操作(对数据库所做动作的记录)
 
大型数据库一般自己有log的呀
 
如果你只是检查使用你开发的软件的客户动作[主要应该是SQL方面的],
你这种事情很容易.
如果不单是这些,这个也容易,正如上面那位说的.
 
如果不怕麻烦,就自己做一个日志的数据库,每次认为有必要记录的时候就写代码往
数据库加入备注。
 
不过一般没有必要的呀!
非要?自己写代码,往数据库里加得了;
 
1、如果选择大型数据库后台的话,它本身就有日志文件;或者用自写的系统表触发器实现,
往自己创建的表中添加纪录。
2、小型桌面数据库只能通过访问它的应用程序代码实现记录了。
 
请各位老兄说详细些,80分拱手送上(不是因为我小气,按因为我的分实在太少,要解决的问题实在太多,而且我是初学者)
 
自己创建一个表,就叫“事务表”吧,用于记录对表的操作。
在每一个按钮事件(或对表有操作的事件)中,添加一段代码,向“事务表”添加记录。
以下是我的程序中的“事务表”:
ID(自增字段),PersonID,OperationDate,FormName,TableName,
OperationType(Insert,delete,update等),Sucsess...
 
lccc的答案我看过了,老兄能否给我详细的代码,在下感谢你的在恩大德!
邮箱:
playxiong@163.net
 
我们可以交流一下
OICQ: 27319794
 
还不是多几个表,把变动的信息及谁作的变动记录进去.
 
各位老兄说的都没有错,但是说归说,做归做,就没有一位大哥肯把源程序代码,如查哪们肯
把源代码给,就像是lccc老兄的一样,哪怕是Tablename这一小部份,我就心满意足了!
 
以下是我的一个按钮事件:
procedure TfrmEnterDepot.cmdSaveClick(Sender: TObject);
begin
if cmdIndex>0 then
begin
if EnterDepotDetailTableEnterNum.Value=0 then
begin
ShowMessage('请输入入库明细。');
DBGrid1.SetFocus;
Abort;
end;
if StrToFloat(DBEdit8.Text)+StrToFloat(DBEdit9.Text)<StrToFloat(DBEdit10.Text) then
begin
ShowMessage('“入库费”与“杂费”之和不能小于“实收金额”。');
DBEdit10.SetFocus;
DBEdit10.Text:=FloatToStr(StrToFloat(DBEdit8.Text)+StrToFloat(DBEdit9.Text));
Abort;
end;
end;
try
if not frmMain.DataBase1.InTransaction then
frmMain.DataBase1.StartTransaction;
//刷新入库主表
EnterDepotTable.Edit;
if((StrToFloat(DBEdit8.Text)+StrToFloat(DBEdit9.Text))=StrToFloat(DBEdit10.Text))then
if Application.MessageBox('费用已经交清,是否将该单标记为“已经结算”?'+Chr(13)+Chr(13)+Chr(13)+'标记为“已经结算”后,将不能进行修改‘删除。','结算确认',MB_YESNO+MB_ICONQUESTION+MB_DEFBUTTON1)=IDYES then
EnterDepotTableBalance.Value:=True;
EnterDepotTable.Post;
EnterDepotTable.ApplyUpdates;
EnterDepotTable.CommitUpdates;
//刷新入库明细表
EnterDepotDetailTable.Edit;
EnterDepotDetailTable.Post;
EnterDepotDetailTable.ApplyUpdates;
EnterDepotDetailTable.CommitUpdates;
//刷新商品库存
if cmdIndex>0 then
begin
EnterDepotDetailTable.Filter:='EnterID='+DBEdit1.Text;
EnterDepotDetailTable.First;
While not EnterDepotDetailTable.Eof do
begin
LookWareTable.Locate('WareID',EnterDepotDetailTableWareID.Value,[]);
LookWareTable.Edit;
LookWareTableWareStock.Value:=(LookWareTableWareStock.Value+EnterDepotDetailTableEnterNum.Value);
EnterDepotDetailTable.Next;
end;
EnterDepotDetailTable.Filter:='';
end;
LookWareTable.Edit;
LookWareTable.Post;
LookWareTable.ApplyUpdates;
LookWareTable.CommitUpdates;
//提交事务
frmMain.DataBase1.Commit;
except
ShowMessage('输入错误,同一入库单中不能有相同的商品。请重新或取消输入。');
frmMain.DataBase1.RollBack;
Abort;
end;
TF:=True;
cmdIndex:=0;
Timer1.Enabled:=False;
ComonButtonClick(Sender);
EnterDepotTable.CachedUpdates:=False;
EnterDepotDetailTable.CachedUpdates:=False;
LookWareTable.CachedUpdates:=False;
//以上是对各个表的操作,如果成功,则记入“事务表”
if cmdIndex=1 then//cmdIndex=1表示是添加新的记录
OperateLogTable.InsertRecord([PersonID, Date, AddrEdit.Text, Null, Null, Null, Null, Null, Null, DiscountEdit.Text]);
PersonID,OperationDate,'frmEnterDepot.cmdSaveClick','EnterDepot,EnterDepotDetail,InfoWare',0,False);
//0=Insert,1=Modify,2=Delete,
else if cmdIndex=2//cmdIndex=2表示是修改记录
.....
else if cmdIndex=3//cmdIndex=3表示是删除记录
.....//
end;

cmdCancel按钮中则是对放弃的操作记录,cmdIndex=2/cmdIndex=3的代码很长,因为要判断
在修改过程中,是否删除了子表记录,是否添加了新的子表记录。
 
ues 触发器
 
lccc兄的程序我已经看过了,但是我还有一些不懂之处,等我研究两天再给分数,谢谢各们老兄
来回答我的问题
 
为什么不使用触发器和存储过程?比在程序中写代码保险
而且安全
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部