又是Dataset not in edit or insert mode的问题

钛元素 2004-11-25 09:15:37
我的目的:把数据库中A字段里的值和B字段里的值放入C字段中去,代码如下:

ds1是ADODataSet,ds2是DataSource

procedure TForm1.btn1Click(Sender: TObject);
begin
ds1.Active := true;
ds2.Edit;


while not ds1.Eof do
begin
if (ds1.FieldValues['c']='') then //如果C字段当前值为空,就写
begin
ds1.Edit; // ---->我都edit了,怎么还出错啊?
ds1.FieldValues['c'] := ds1.FieldValues['a']+' / '+ ds1.FieldValues['b'];
end;

ds1.Next;
end;
ds1.Post;
ds1.Refresh;
end;

实在不明白了,请教.
...全文
806 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
钛元素 2004-11-25
  • 打赏
  • 举报
回复
我用adoQuery来写,数据库也提交了,呵呵,谢谢你,结贴啦.
没有用批更新呢
代码如下:
procedure TForm1.btn6Click(Sender: TObject);
begin
qry1.Active := true;
while not qry1.Eof do
begin
qry1.Edit;
qry1.FieldValues['c']:=qry1.FieldValues['a']+qry1.FieldValues['b'];
qry1.Post;
qry1.Next;
end;

end;
ssq237712 2004-11-25
  • 打赏
  • 举报
回复
adoQuery和adodataset的差不多,不过sql语句在adoquery.sql属性中写。

还有检查你的ds1的lockType属性,如果是batch的那个,在执行完后要记得applyupdate
ssq237712 2004-11-25
  • 打赏
  • 举报
回复
ds1.FieldValues['c']是Variant型的,不一定就是''哦,也有可能是null
这样写嘛:ds1.FieldByName('c').AsString = ''
钛元素 2004-11-25
  • 打赏
  • 举报
回复
用adoquery怎么写代码啊?
请回复,要结贴了,谢谢你.
钛元素 2004-11-25
  • 打赏
  • 举报
回复
数据库里我设了一个主键ID,是自动数值的
现在我也去掉了ds1.refresh,代码如下:
procedure TForm1.btn5Click(Sender: TObject);
begin
ds1.Active := true;
ds2.Edit;
while not ds1.Eof do
begin
if (ds1.FieldValues['c']='') then //如果C字段当前值为空,就写
begin
ds1.Edit; // ---->我都edit了,怎么还出错啊?
ds1.FieldValues['c'] := ds1.FieldValues['a']+' / '+ ds1.FieldValues['b'];
ds1.Post;

end;

ds1.Next;
end;
//ds1.Post;
//ds1.Refresh;
end;

没有显示错误,但是,也不会执行把A和B字段里的数据存放到C字段里去
ssq237712 2004-11-25
  • 打赏
  • 举报
回复
哦,是ado啊,用adoquery试试,adoDataSet据说有点bug。还有,最好在你的数据库里设个PK,
ssq237712 2004-11-25
  • 打赏
  • 举报
回复
你看是哪一句出的错,个人感觉ds1.Refresh;没什么意义,本身就是在ds1上作的修改
钛元素 2004-11-25
  • 打赏
  • 举报
回复
字段A 和字段B里都有数据,字段C里没有数据
ds没有连接updatesql啊,就select * from customer,是在commandtext属性里写的
钛元素 2004-11-25
  • 打赏
  • 举报
回复
难道是数据库里没有主键,就无法定位数据记录了吗?
ssq237712 2004-11-25
  • 打赏
  • 举报
回复
那些字段a、b、c都有?
ds有没连接updatesql,如果连接的话,检查下updatesql的语句
钛元素 2004-11-25
  • 打赏
  • 举报
回复
按照 ssq237712(流亡帅哥) 的方法,没有出现前面的错了,但是,出现如下错误:
'缺少更新或刷新的键列信息'
这是什么意思啊
钛元素 2004-11-25
  • 打赏
  • 举报
回复
表是肯定打开了的,我还用一个dbgrid来显示
钛元素 2004-11-25
  • 打赏
  • 举报
回复
不行啊,奇怪了,就算把if (ds1.FieldValues['c']='') then判断去掉也是错的,真是奇怪啊
yinzhiw 2004-11-25
  • 打赏
  • 举报
回复
你的表有没有打开?
ssq237712 2004-11-25
  • 打赏
  • 举报
回复
哦,最后那个ds1.Post去掉
钛元素 2004-11-25
  • 打赏
  • 举报
回复
暂时了解了,换成table时出错是因为tbl1.Refresh;这句在active:=false后
ssq237712 2004-11-25
  • 打赏
  • 举报
回复
1、next时自动post了的,所以后面的Post当然出错。
2、如果 if (ds1.FieldValues['c']='') then不满足,当然post时要报错的

这样:
while not ds1.Eof do
begin
if (ds1.FieldValues['c']='') then //如果C字段当前值为空,就写
begin
ds1.Edit; // ---->我都edit了,怎么还出错啊?
ds1.FieldValues['c'] := ds1.FieldValues['a']+' / '+ ds1.FieldValues['b'];
ds1.Post;

end;

ds1.Next;
end;
ds1.Post;
ds1.Refresh;
钛元素 2004-11-25
  • 打赏
  • 举报
回复
换成ADOTable也是不行,不过提示说'Cannot perform this operation on a closed dataset'
真是奇怪,明明打开了啊
procedure TForm1.btn3Click(Sender: TObject);
begin

tbl1.Active := true;
tbl1.Active := true;
tbl1.Edit;
tbl1.FieldByName('c').AsString := tbl1.FieldValues['a']+ tbl1.FieldValues['b'];
tbl1.Post;
tbl1.Active:=false;
tbl1.Refresh;

end;
钛元素 2004-11-25
  • 打赏
  • 举报
回复
但是运行起来,就提示'Dataset not in edit or insert mode'
pengxuan 2004-11-25
  • 打赏
  • 举报
回复
代码没错

2,497

社区成员

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

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