ltBatchOptimistic 非空列不能为null

powerp 2012-02-29 03:14:13
描述如下

环境 D5 SQL2000 ADO
补丁都打上了
后台表
Create Table aaa(
ID INT NOT NULL,
UserID INT NOT NULL,
constraint PK_aaa primary key (ID)
)
GO

form上放 datasource1->ADOQuery1 还有DBGrid1
都是标准控件,
ADOQuery1.SQL.Text :='Select * from aaa'
ADOQuery1.locktype 为 ltBatchOptimistic
运行
在DBgrid输入值
ID UserID
1 1
2 2

修改为
ID UserID
1
2 2
提示非空列不能为空
我并没有提交数据,只是在网格里编辑
...全文
136 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
powerp 2012-03-02
  • 打赏
  • 举报
回复
结贴太快了,D7依然有问题
powerp 2012-03-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kaikai_kk 的回复:]
本来回答是想让LZ抛砖引玉的,看来LZ不会转弯
你想不写一行代码就出来一个软件吗?太懒了吧

在ADOQuery1BeforePost处理一下,这样就不受null约束了:
if ADOQuery1.FieldByName('UserID').isnull then
ADOQuery1.FieldByName('UserID').asstring:='';
[/Quote]

这个不是会不会转弯的问题,难道在一个系统里只有有post都要把后台NOTNULL的都检查一遍,
这个从性能上也不是太好,除非没有办法了
不过还是感谢大家
powerp 2012-03-02
  • 打赏
  • 举报
回复
看错了,我的D7是没有问题的,可能是你设置或D5的问题吧

非常感谢,因为机器上一直没装D7,然后我们的构件也是用D7的改过来的,所以没有想到是这个问题
总之非常感谢
我看见佛 2012-03-01
  • 打赏
  • 举报
回复
你数据库中不能为NULL啊,,C/S是长联接,所以在提交时会出错。
ADOQuery1.FieldByName('UserID').AsString:=''; ''空字符串<>null
那就设置为''就好了
powerp 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]
userid不能为空啊,没提交,也会遵守这个规则
[/Quote]

我跟踪过源码,在
if not VarIsEmpty(Data) then
Recordset.Fields[FieldNo - 1].Value := Data;
赋值为null的时候就出错了,这个是ADO的特性么?
在用TDBGrid的时候难免用户会删除某个格的数据,而这个格的字段为null的时候出错
各位有什么好的处理方式呢?
我看见佛 2012-03-01
  • 打赏
  • 举报
回复
你把同样的代码用D7运行下看不就知道了问题到底是什么导致了?
我看见佛 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 powerp 的回复:]
引用 4 楼 case5166 的回复:
你数据库中不能为NULL啊,,C/S是长联接,所以在提交时会出错。
ADOQuery1.FieldByName('UserID').AsString:=''; ''空字符串<>null
那就设置为''就好了


兄弟,看清楚,我没有提交,在网格里操作而已,我是批量提交的
数据库设置NOT NULL是为了保证数据完整性
我也不是代码去修改它,……
[/Quote]看错了,我的D7是没有问题的,可能是你设置或D5的问题吧
kaikai_kk 2012-03-01
  • 打赏
  • 举报
回复
本来回答是想让LZ抛砖引玉的,看来LZ不会转弯
你想不写一行代码就出来一个软件吗?太懒了吧

在ADOQuery1BeforePost处理一下,这样就不受null约束了:
if ADOQuery1.FieldByName('UserID').isnull then
ADOQuery1.FieldByName('UserID').asstring:='';
powerp 2012-03-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 case5166 的回复:]
你数据库中不能为NULL啊,,C/S是长联接,所以在提交时会出错。
ADOQuery1.FieldByName('UserID').AsString:=''; ''空字符串<>null
那就设置为''就好了
[/Quote]

兄弟,看清楚,我没有提交,在网格里操作而已,我是批量提交的
数据库设置NOT NULL是为了保证数据完整性
我也不是代码去修改它,ADOQuery1.FieldByName('UserID').AsString:='',这个完全没有意义

我上面的模式应该大家都有用到啊,不知道你们是怎么处理的
有办法跳开么
感谢下,希望有人说说
kaikai_kk 2012-02-29
  • 打赏
  • 举报
回复
ADOQuery1.FieldByName('UserID').Clear;结果是null
下面这样就不是null了
ADOQuery1.FieldByName('UserID').AsString:='';
bdmh 2012-02-29
  • 打赏
  • 举报
回复
userid不能为空啊,没提交,也会遵守这个规则

2,496

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧