C
CJ
Unregistered / Unconfirmed
GUEST, unregistred user!
一. 问题提出:
做一个程序,用adotable/adoquery连接sql server,为了简单期间,DBGrid+DBNavigator。
服务器上随便用个数据表,其中一个字段设立Default值,假定为列A。运行程序后,新建记录,
填写其它必须记录,列A值为空,保存之。此刻,系统报错:服务器无法定位记录,
可能记录被修改,或者是记录被删除。
二. 问题分析:
由于Default值有系统自动赋予,客户端无法得知,所以造成无法定位刚才的记录。
同样的,如果用Insert Trigger修改数据,或后台用sp修改数据,也会造成类似问题。
三. 可能的解决方法:
1. 在客户端给出和服务器端一样的Default定义,这也是我一直用的方法,
以下给出实例〔伪?〕代码:
...
const
TB1_NAME_FEFAULT = 'NO NAME';
...
procedure ADOTable1BeforePost(...);
begin
with ADOTable1 do
begin
if FieldByName('Name').isNil then //如果为空
FieldByName('Name').Value := TB1_NAME_FEFAULT; //赋予默认值
if ...
...
FieldByName('Age').Value := GetAge(FieldByName('Age').Value,now);
//GetAge为自定义函数,计算年龄,本来可以有Trigger完成
...
end;
end;
同样的,需要用任何trigger计算的地方也在这里一并计算。见以上代码。
但是问题是,如此一来,服务器端的Trigger、Defualt变的毫无用处。而且,在多个客户端
应用程序共同实用服务器端数据库的情况下,每次服务器端的修改,你必须重新发布应用程序。
三层在这个问题上表现良好,任何规则有中间层负责,可两层怎么办?真的无法解决了吗?
曾经想过直接读取服务器端信息,把Default找出来,事先填在客户数据上。可这样也太夸张了
吧?何况Trigger的问题还没有解决。