描述如下环境 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
提示非空列不能为空
我并没有提交数据,只是在网格里编辑

解决方案 »

  1.   

    userid不能为空啊,没提交,也会遵守这个规则
      

  2.   

    ADOQuery1.FieldByName('UserID').Clear;结果是null
    下面这样就不是null了
    ADOQuery1.FieldByName('UserID').AsString:='';
      

  3.   


    我跟踪过源码,在
                  if not VarIsEmpty(Data) then
                    Recordset.Fields[FieldNo - 1].Value := Data;
    赋值为null的时候就出错了,这个是ADO的特性么?
    在用TDBGrid的时候难免用户会删除某个格的数据,而这个格的字段为null的时候出错
    各位有什么好的处理方式呢?
      

  4.   

    你数据库中不能为NULL啊,,C/S是长联接,所以在提交时会出错。
    ADOQuery1.FieldByName('UserID').AsString:=''; ''空字符串<>null
    那就设置为''就好了
      

  5.   


    兄弟,看清楚,我没有提交,在网格里操作而已,我是批量提交的
    数据库设置NOT NULL是为了保证数据完整性
    我也不是代码去修改它,ADOQuery1.FieldByName('UserID').AsString:='',这个完全没有意义我上面的模式应该大家都有用到啊,不知道你们是怎么处理的
    有办法跳开么
    感谢下,希望有人说说
      

  6.   

    本来回答是想让LZ抛砖引玉的,看来LZ不会转弯
    你想不写一行代码就出来一个软件吗?太懒了吧在ADOQuery1BeforePost处理一下,这样就不受null约束了:
    if ADOQuery1.FieldByName('UserID').isnull then
    ADOQuery1.FieldByName('UserID').asstring:='';
      

  7.   

    看错了,我的D7是没有问题的,可能是你设置或D5的问题吧非常感谢,因为机器上一直没装D7,然后我们的构件也是用D7的改过来的,所以没有想到是这个问题
    总之非常感谢
      

  8.   


    这个不是会不会转弯的问题,难道在一个系统里只有有post都要把后台NOTNULL的都检查一遍,
    这个从性能上也不是太好,除非没有办法了
    不过还是感谢大家