有关三层应用的问题(100分)

  • 主题发起人 主题发起人 JSNJXC
  • 开始时间 开始时间
J

JSNJXC

Unregistered / Unconfirmed
GUEST, unregistred user!

编程环境:Delphi6+ADO+MSSQL2000 (winSocket连接方式)

1. 如何在客户端进行字段级的有效性校验。比如:
人员表中要求人员编码(cPCode 主键)必须唯一,在桌面或两层系统中
若用户输入了重复值系统将产生异常,但在三层客户端中用户输入了
重复值只要不提交到应用服务器,ClientDataSet就不会产生异常,这该
怎么处理?CustomConstraints或ImportedConstraints属性该怎么赋值。
另外,ImportedConstraints该怎么用,是否只能用于BDE/IDAPI。

2. 业务逻辑都说应写在中间层,但究竟该如何实现,比如:
要求人员编码的长度不能超过6位,若超出则给出提示并停止下一步操作
,否则根据编码格式(如:xx xx xx)计算出编码级次放入另一字段
(iCodeLevel)中。这一"业务逻辑"在中间层该如何实现。

3. 因网路或其他原因造成客户端长时间连不上应用服务器,或者SQL服务器
根本就未开启,在编程中应如何处理比较好,以避免用户长时间傻傻等待
的尴尬局面。
三层应用初学乍练,问题多多,望三层应用高手仁兄多指教。
(Reward: 100--500)
 
不好意思,小弟也是此中低手,想听听
 
仅供参考:
1. 如何在客户端进行字段级的有效性校验。
实际上,我认为没必要非得每录入一条就检查重复,完全可以在提交时再检查。
CustomConstraints允许你自定义一些数据库没有的其他限制,如你可以在客户端限制
录入的数字必须大于100,而不一定要使用代码。
ImportedConstraints时指从中间层导入的限制条件,可能是数据库定义的,
也可能是中间层定义的。我基本上没用过。

2. 业务逻辑都说应写在中间层,但究竟该如何实现
具体代码我不写了,但你这个问题实际上牵扯到了如何判断业务逻辑应放在哪一层。
你认为你的例子提出的所谓业务逻辑应该放在中间层吗?我个人不这么认为。
至于业务逻辑在中间层如何实现,问题太大,我也回答不了。

3. 因网路或其他原因造成客户端长时间连不上应用服务器,或者SQL服务器
根本就未开启,在编程中应如何处理比较好,以避免用户长时间傻傻等待
的尴尬局面。
所有你提的情况,其实都不成问题,很简单——报错。
如果客户端连不上应用服务器,系统会在一定时间后抛出一个异常(exception),你只要
在客户端的代码中获取就可以了。这个时间也可以控制,具体代码还烦请您自己查查,反正
我没控制过,系统默认的时间还是可以接受的。
如果应用服务器连不上数据库,在中间层也会抛出一个异常,你只要获取这个异常,然后通知
客户端就可以了。我一般不主动通知,而是在客户端提交数据操作后使用midas的机制通知,
这样比较简单。
 
光说没用啊!给出代码啊!我也找了很久,就是没有答案
 
关注。。。。
 
这些问题都是大家常见的问题,都很关心!
up~
继续!
 
1. 如何在客户端进行字段级的有效性校验。
我不同意forest gun的说法,如果我一次新增多条记录,在保存时由于检查有效性,必然使
保存时间延长,给用户造成非常慢的感觉。我认为每新增一条就马上执行有效性检查,这样
可以使时间分散,用户感觉比较好。
2. 业务逻辑都说应写在中间层,但究竟该如何实现
其实并不主张将所有的业务逻辑写在中间层,那样中间层会庞大无比,这是绝对不主张的。
放在中间层的业务逻辑必须做到通用,能够在许多情况下实现共用代码。
所谓的写法。举一个简单的例子,在中间层写一个LOGIN方法来检查用户合法性。
function Ttest.Login(var userid:olevariant;const password:widestring):olevariant;
begin
with adoquery1do
begin
if active then
close;
sql.clear ;
sql.sql.add('select * from USERS where userid='+#39+userid+#39+' and password='+
#39+password+#39);
Prepared;
Open;
if not isempty then
result:=true
else
result:=false;
Close;
end;
这是一个最简单的函数,其实所有的业务逻辑只是围绕这此函数与方法进行扩展而己
3. 因网路或其他原因造成客户端长时间连不上应用服务器,或者SQL服务器
根本就未开启,在编程中应如何处理比较好,以避免用户长时间傻傻等待
的尴尬局面。
晕!如果你有多个服务器,你可以用容错处理的方法,如果只有一个服务器,那就
报错就是了。
 
1. 如何在客户端进行字段级的有效性校验。
是您在保存前进行的合法性检查,在输入时没有这个必要。
2:要求人员编码的长度不能超过6位
关于编号这类东东。最好不要让用户自已输入。我一般写一个方法在很严格的规律中
产生。
3:因网路或其他原因造成客户端长时间连不上应用服务器
如果是简单的网络情况连不上服务器。这个应该很好处理。进行时间判断。
但是,如果是其它情况经常连不上服务器。那您就麻烦大了。
 
To 贴主:关于对用户输入有效性的验证,我粗谈一下自己的观点:
把这项工作交给服务器端去做是比较安全的,这样可以避免一些非法的或恶意的客户端
传入错误的参数,对你的系统造成攻击(这看起来也许有点多虑了),但在实际情况中,
一些无意的错误输入也会导致你的程序出错,比如说传入空值、过大或过小的值,都是要避免的,比如说用户输入了过长的字符串,这很简单:
if wcslen(ParameterStr)>PERMIT_PARAM_LEN{
//PERMIT_PARAM_LEN为你自己定义的常量值
*Result = -1;
//长度不符,立即返回,让客户端去处理返回值
return S_FALSE;
}else
{
//提交数据等等
}
(请原谅我使用了C语言,我想你能把它理解为Delphi代码)
在提交数据前,检验每一个参数是很重要的,写起代码来可能很烦,但那是建立一个具
有较高可靠性程序的前提。
To 无忧鱼:
我赞同你的一些观点。我相信你的Login方法的代码只是一个例程,在实际应用当中
并不会这么写。是吗?比如我知道你的系统里有一个用户的ID是9527(对这个编号是不
是有点耳熟?),我在用户名输入框里填上"9527 --",啊哈!我就可以登录你的系统
了,其实用户ID是否9527并不重要,重要的是我不用知道用户密码。试试看?
 
請問你這個function在中問層那個地方定義:protected 下面定義還是在public下定義?
function Ttest.Login(var userid:olevariant;const password:widestring):olevariant;
 
后退
顶部