如何用三层结构实现收费程序!(100分)

  • 主题发起人 主题发起人 liao_hc
  • 开始时间 开始时间
L

liao_hc

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠,我正在设计局域网内的自来水收费管理程序(sql server+delphi),主要分水费数据录入和收费两大功能,想用三层结构结构,有必要吗?有什么好处?如何实现才能体现优越性?
另外,抄表机的数据如何传送到sql server中??
急!!
 
局域网内做三层,我觉得没有必要。
 
to hiyaolee:
我是想以后能在DDN中使用的,有什么高见吗?
 
抄表机的数据可在客户端提供接口,也可在服务器端专门写一个接口程序(不经过中间层)
 
to jopi:
在客户端提供接口的话,是不是把把抄表数据文件下载到本地机器,然后把数据表再用TBatchMove控件添加到数据库服务器中相应的表中?
在服务器端怎么写程序,能说具体点吗?给点思路也行呀
 
在Type Libary中定义接口函数: sRslList为in,out,BSTR *
procedure SaveItems(var sRslList: WideString);
safecall;
procedure TSaveCommResult.SaveItems(var sRslList: WideString);
var
L: TStringList;
i: Integer;
begin
L := TStringList.Create;
L.Text := sRslList;
with SQLStoredProc1do
//dbExpress
try
for i:=0 to L.Count-1do
begin
if Active then
Close;
ParamByName('Param1').Asxxx := ...
ParamByName('Param2').Asxxx := ...
...
try
ExecProc;
except
end;
....
end;
finally
Close;
L.Free;
end;
end;

客户端:
L := TStringList.Create;
try
L.Add(sItem);//将抄表记录逐条加入
...
with DCOMConnection1do
begin
if not Connected then
Connected := True;
S := L.Text;
AppServer.SaveItems(S);
L.Text := S;//return something
Connected := False;
end;
finally
L.Free;
end;

 
to labelsoft:
看得出你是位高手,但本人确实一菜鸟,你给得程序我还不是特别理解,比如dbexpress就未用过。如果把f:/aaa.dbf通过中间层传递给sql server,接口程序如何编写?客户端呢?程序能给详细点吗?
还有,能留下你的email或是qq号吗?谢谢!!!
my email: liao_hc@163.com qq:995292
 
其实不一定要用dbexpress,象sql server就可以用ADO,实现方法都差不多。你可先将aaa.dbf中的记录查询出来,需要的字段转换为字符串,记录逐条加入一TStringList变量L中,然后S := L.Text,S为string,再调用AppServer.SaveItems(S),在接口函数SaveItems(S)中,L.Text := sRslList;的作用是将传过去的字符串再转换为原来的各条记录,以便用存储过程逐条加入sql server这边的表中。另外,为安全起见,可使用事务控制。我没有qq,好多年不用,不能用了,有问题发my email: labelsoft@163.com
 
labelsoft的方法未能将多条记录放在一个事务中。应直接传detal
 
这样,你直接在SQL中写一个存储过程,设定要用参数接口,然后用TTable部件直接连接dbf文件,打开后一条条的加入,不过记着在存储过程中加入认证,以免在出错后重复插入相同的数据!
直接用commandtext执行存储过程,很方便的
 
谢谢各位!
to glpttlb:
具体怎么实现呢?
to 82625741
存储过程中怎么进行认证呢?有代码吗?
另外,是否可以把dbf文件传到应用服务器再转换?这样就不必在客户端转换了,怎么实现?
 
这是我用来更新电表记录的存储过程
/*根据电表编号更新抄表记录*/
CREATE PROCEDURE MyProc_UpDateAmmeterRecord
(
@AmmeterNo varchar(20),
@PreCount numeric(15,2),
@Count numeric(15,2),
@Date DateTime
) AS
Declare @AmmeterID int,
@Month smallint,
@Year smallint
Select @Year= Case Month(@Date)
when 1 then
Year(@Date)-1
else
Year(@Date)
end,
@Month=Case Month(@Date)
When 1 then
12
else
Month(@Date)-1
end
Select @AmmeterID=ID from Ammeter where IsReplace=0 and No=@AmmeterNo
if @AmmeterID IS NULL
begin
Delete from AmmeterRecord Where AmmeterID=@AmmeterID and [Year]=@Year and [Month]=@Month
insert into AmmeterRecord (AmmeterID,PreCount,[Count],[Date],[Year],[Month]) Values (@AmmeterID,@PreCount,@Count,@Date,@Year,@Month)
if not Exists(Select ID from AmmeterRecord where AmmeterID=@AmmeterID and [Year]=Year(@Date) and [Month]=Month(@Date))
Update Ammeter Set PreCount = @Count where ID=@AmmeterID
Return(0)
end
else
Return(1)
GO
 
如果只是更新单条记录labelsoft的方法很好,绝对是多层体系结构的实现方法,
82625741的方法是典型2层的做法,通用型不好。
而且其实现方法效率太低。
应改一下
update......
if @@rowcount=0 insert ......
 
如果用FR联网,程序做成C/S两层结构就满足你的要求了。
抄表可以直接用TCP传输,收费程序用数据库实现。
很简单的系统啊。
 
后退
顶部