浅谈三层数据库技术(1)

来源:互联网 发布:蜘蛛侠蛛丝发射器淘宝 编辑:程序博客网 时间:2024/06/17 00:46
 

DELPHIMIS系统通常有两种做法,一种是写SQL语句,一种是通过DELPHI自带的数据集控件进行的操作。前者使用灵活,功能强大,几乎可以实现对于数据库的任何一个操作,但缺点是使用烦琐,容易出错。后者,利用数据集控件进行操作,方便,简单,但就灵活程度上不及SQL语句。以下就以我最近写的一个三层小程序,主要是以SQL语句实现(SQL语句都在服务器)在MIS系统里,一般实现添加数据,删除数据,修改数据等操作,先就以我在实现这几种操作时碰到的问题,做下讨论

一,添加数据

1,服务器

数据库 project

表名 clientinfoM

ADOQUERY1SQL属性中写入

insert clientinfoM  VALUES (:p1),

实现ANSIUNICODE字符码的转换:在DataSetProvider1BeforeExecute事件里写入如下代码:

adoquery.Parameters.ParamByName('p1').Size :=Length(adoquery5.Parameters.ParamByName('P1').value)+1; (注意:只有中文才有可能显示异常,如果是英文字段,可以不转换)

 

2,客户端

clientdataset1.Close;//关闭数据集;

clientdataset1.ProviderName:='datasetprovider1';//使客户端数据集指向应用层服务器相应的datasetprovider

clientdataset1.Params.clear;//清空以前参数;

clientdataset1.Params.CreateParam(ftstring ,'p1',ptInput);//创建动态参数;

clientdataset1.Params.ParamByName('p1').AsString:=(edit.Text);//对动态参数进行赋值;

clientdataset1.Execute//执行服务器端的SQL语句;

二,修改数据

1,服务器

ADOQUERY2SQL属性中写入

update clientinfoM set CustName=:p11 where CustNo=:p22

实现ANSIUNICODE字符码的转换:在DataSetProvider2BeforeUpdateRecord事件里写入如下代码:

adoquery2.Parameters.ParamByName('p11').Size :=Length(adoquery2.Parameters.ParamByName('P11').value)+1;(注意:只有中文才有可能显示异常,如果是英文字段,可以不转换)

2,客户端

clientdataset1.Close;//关闭数据集;

clientdataset1.ProviderName:='datasetprovider2';//使客户端数据集指向应用层服务器相应的datasetprovider2

clientdataset1.Params.clear;//清空以前参数;

clientdataset1.Params.CreateParam(ftstring ,'p11',ptInput);//创建动态参数;

clientdataset1.Params.CreateParam(ftstring ,'p22',ptInput);//创建动态参数;

clientdataset1.Params.ParamByName('p11').AsString:=(edit1.Text);//对动态参数进行赋值;

clientdataset1.Params.ParamByName('p22').AsString:=(edit2.Text);//对动态参数进行赋值;

clientdataset1.Execute//执行服务器端的SQL语句;

三,显示数据

1,  服务器

ADOQUERY3SQL属性中写入

select * from clientinfoM  where CustName=:Pname

实现ANSIUNICODE字符码的转换:在DataSetProvider1BeforeGetRecords事件里写入如下代码:

adoquery3.Parameters.ParamByName('Pname').Size :=Length(adoquery3.Parameters.ParamByName('Pname').value)+1; (注意:只有中文才有可能显示异常,如果是英文字段,可以不转换)

2,客户端

clientdataset1.Close; //关闭数据集

clientdataset1.ProviderName:='datasetprovider3'; 使客户端数据集指向应用层服务器相应的datasetprovider

dbgrid4.DataSource:=datasource1;

clientdataset1.Params.Clear;

clientdataset1.Params.CreateParam(ftstring,'Pname',ptInput);

clientdataset1.Params.ParamByName(Pname').AsString:=trim(combobox3.text);

clientdataset1.Open; //执行服务器端的SQL语句;

(小结:SQL关键字为UPDATAINSERTExcute,如SELECTOpen,打开数据集)

四,其他技术

1,  省市对照表

ComboBox6中是省(province)ComboBox7中是市(city).

ComboboxChange事件中写入

procedure TForm1.ComboBox6Change(Sender: TObject);

var

i:integer;

begin

clientdataset1.Close;

clientdataset1.ProviderName:='datasetprovider4';

dbgrid1.DataSource:=datasource1;

clientdataset1.Params.Clear;

clientdataset1.Params.CreateParam(ftstring,'province',ptInput);

clientdataset1.Params.ParamByName('province').AsString:=combobox6.text;

clientdataset1.Open;

combobox7.Items.Clear;

combobox7.Text:=clientdataset1.FieldByName('city').AsString;

for i:=0 to  clientdataset1.RecordCount-1 do

begin

combobox7.Items.Add(clientdataset1.FieldByName('city').AsString);

clientdataset1.Next;

end;

end;

2,由邮政编码,自动填写区号

EDIT49change事件中写入。

其中edit49为邮政编码(youbian)edit66为区号(area)

procedure TForm1.Edit49Change(Sender: TObject);

begin

if edit49.Text<>'' then

begin

clientdataset1.Close;

clientdataset1.ProviderName:='datasetprovider7';

dbgrid1.DataSource:=datasource1;

clientdataset1.Params.Clear;

clientdataset1.Params.CreateParam(ftstring,'youbian',ptInput);

clientdataset1.Params.ParamByName('youbian').AsString:=edit49.Text;

clientdataset1.Open;

edit66.Text:=clientdataset1.FieldByName('area').AsString;

end;

end;

3,三层里的模糊查询

在三层里的模糊查询和二层有些区别,我试过二层里的方法,好象不太顶用。以下是我的方法:

ClientDataSet2.Filter := '字段名 LIKE ''%' +ComboBox8.Text + '%'' ';

ClientDataSet2.Filtered := true;

4DbGrid的点击事件

ComboBox8中显示DbGrid1中单击的内容。

procedure TForm2.DBGrid1CellClick(Column: TColumn);

begin

form1.ComboBox8.Text:=dbgrid1.Fields[0].AsString;

end;

由于才写三层时间不长,一个多月,把自己的心得写出来和大家分享,如有说的不对的地方,请指正,QQ12419483

原创粉丝点击