描述如下环境 D5 SQL2000 ADO
补丁都打上了
后台表
Create Table aaa(
ID INT NOT NULL,
UserID INT NOT NULL,
constraint PK_aaa primary key (ID)
)
GOform上放 datasource1->ADOQuery1 还有DBGrid1
都是标准控件,
ADOQuery1.SQL.Text :='Select * from aaa'
ADOQuery1.locktype 为 ltBatchOptimistic
运行
在DBgrid输入值
ID UserID
1 1
2 2修改为
ID UserID
1
2 2
提示非空列不能为空
我并没有提交数据,只是在网格里编辑
补丁都打上了
后台表
Create Table aaa(
ID INT NOT NULL,
UserID INT NOT NULL,
constraint PK_aaa primary key (ID)
)
GOform上放 datasource1->ADOQuery1 还有DBGrid1
都是标准控件,
ADOQuery1.SQL.Text :='Select * from aaa'
ADOQuery1.locktype 为 ltBatchOptimistic
运行
在DBgrid输入值
ID UserID
1 1
2 2修改为
ID UserID
1
2 2
提示非空列不能为空
我并没有提交数据,只是在网格里编辑
下面这样就不是null了
ADOQuery1.FieldByName('UserID').AsString:='';
我跟踪过源码,在
if not VarIsEmpty(Data) then
Recordset.Fields[FieldNo - 1].Value := Data;
赋值为null的时候就出错了,这个是ADO的特性么?
在用TDBGrid的时候难免用户会删除某个格的数据,而这个格的字段为null的时候出错
各位有什么好的处理方式呢?
ADOQuery1.FieldByName('UserID').AsString:=''; ''空字符串<>null
那就设置为''就好了
兄弟,看清楚,我没有提交,在网格里操作而已,我是批量提交的
数据库设置NOT NULL是为了保证数据完整性
我也不是代码去修改它,ADOQuery1.FieldByName('UserID').AsString:='',这个完全没有意义我上面的模式应该大家都有用到啊,不知道你们是怎么处理的
有办法跳开么
感谢下,希望有人说说
你想不写一行代码就出来一个软件吗?太懒了吧在ADOQuery1BeforePost处理一下,这样就不受null约束了:
if ADOQuery1.FieldByName('UserID').isnull then
ADOQuery1.FieldByName('UserID').asstring:='';
总之非常感谢
这个不是会不会转弯的问题,难道在一个系统里只有有post都要把后台NOTNULL的都检查一遍,
这个从性能上也不是太好,除非没有办法了
不过还是感谢大家