数据库的加解密问题,请高手指点!300分(300分)

  • 主题发起人 gaojun89757
  • 开始时间
G

gaojun89757

Unregistered / Unconfirmed
GUEST, unregistred user!
我用组件:DCOMCONTNCTION,DATASETPROVIER,CLIENTDATASET做了一个简单的三层应用,
准备在将其中一个字段加密存入后台数据库(其他字段不加密),而在客户端浏览时显示
的应是解密后的内容,数据加解密由应用程序服务器完成。
服务器程序:用了 remotedatamodule 放置了一个DATASETPROVER 和 TABLE
客户端程序:用了 clientdataset,datasource,dcomcontnaction, DBGRID,DBnavigator;
A) 在DATASETPROVER 的ongetdata事件中解密,
B) 在DATASETPROVER 的beforeupdaterecords事件中加密
现在的问题是:
1)以上A、B均不做时可将客户端数据更新正常写入后台数据库
2)做A、B中的一个时可正常加密或解密,添加记录可以正确记入数据库,但修改和删除等操作不能
3)A、B两项同时做时报错;
请各位帮忙指点!
 
引用事件没什么问题,就看你的程序了,能否贴出来看一下。
 
to myname:
procedure Tserver.DataSetProvider1GetData(Sender: TObject;
DataSet: TCustomClientDataSet);
var
aa:string;
begin
DataSet.open;
while not DataSet.eofdo
begin
aa:=DataSet.FieldByName('company').asstring;
DataSet.Edit;
DataSet.FieldByName('company').asstring:=aa+' already decrypt';
DataSet.next;
end;
end;

procedure Tserver.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TCustomClientDataSet;
UpdateKind: TUpdateKind;
var Applied: Boolean);
var
aa:string;
begin
DeltaDS.open;
while not DeltaDS.eofdo
begin
aa:=DeltaDS.FieldByName('company').asstring;
DeltaDS.Edit;
DeltaDS.FieldByName('company').asstring:=aa+ ' already encrypt';
DeltaDS.next;
end;
end;
 
建议不要在表中直接进行加解密。你可以定义一个记录变量,将数据读入变量后截密,
加密后写入数据库。
 
以下代码调试通过
procedure TForm1.DataSetProvider1BeforeUpdateRecord(Sender: TObject;
SourceDS: TDataSet;
DeltaDS: TClientDataSet;
UpdateKind: TUpdateKind;
var Applied: Boolean);
var aa:string;
begin
if updatekind<>ukdelete then
//排除删除操作,由于每次只更新一条记录,不需要循环
begin
aa:=DeltaDS.FieldByName('ss').newvalue;
DeltaDS.Edit;
DeltaDS.FieldByName('ss').newvalue:=decrypt(aa);
DeltaDS.post;
//后面不能要deltads.next, 否则修改记录无法存盘
end;
end;

procedure TForm1.DataSetProvider1GetData(Sender: TObject;
DataSet: TClientDataSet);
var
aa:string;
begin
while not DataSet.eofdo
begin
aa:=DataSet.FieldByName('ss').asstring;
aa:=trim(aa);
DataSet.Edit;
DataSet.FieldByName('ss').asstring:=encrypt(aa);
dataset.post;
DataSet.next;
end;
end;

祝顺利
 
还需要注意一点
加密字段ProviderFlags属性中的pfInWhere必须设为false,否则无法存盘
 
function encode(s:string):string;//存
var z,i:integer;
str1:string;
begin
z:=length(s);
z:=z mod 2;
if z=0
then
begin
str1:=s;
setlength(result,length(str1));
end
else
begin
str1:=' '+s;
setlength(result,length(str1));
end;
for i:=1 to length(str1)do
begin
result:=char(not byte(str1));
end;
end;
function decode(s:string):string;//取
var i:integer;
begin
setlength(result,length(s));
for i:=1 to length(s)do
begin
result:=char(not byte(s));
end;
result:=trim(result);
end;
 
是啊!,在BeforeUpdateRecord事件中不能在next
因为dataset每更新一条记录都要触发该事件
 
谢谢各位的帮助,特别要感谢myname,现在问题已经解决了!
谢谢大家!
 
顶部