ADOQuery1.Post提交数据修改后未更新数据库

zm0916 2016-06-01 02:00:58
本人初学,采用DBGRID DataSource ADOQuery ADOConnection 连接mysql数据库,数据库连接正常,查询正常,修改数据时出现问题(部分代码如下),在xp下用ADOQuery1.Open;ADOQuery1.edit..... ADOQuery1.Post;正常,能成功修改数据,但在win7下出错,提示“数据提供程序或其他服务返回 E_FAIL状态”,修改ADOQuery locktype后,win7下不提示错误,但程序执行时DBGRID显示数据已经修改了,用select * from 刷新数据后发现数据并未修改。使用{}内代码时win7下正常,也能成功修改数据。请问大师们,如何在win7下使用ADOQuery1.Open;ADOQuery1.edit..... ADOQuery1.Post 成功修改数据。
部分代码如下:
if edit1.Text<>'' then
begin
Memo1.Lines.Add('');
Memo1.Lines.Add('高频模块');
IdIcmpClient1.Host:=Edit1.Text;
IdIcmpClient1.ReceiveTimeout:=1000;
Button1.Enabled:=false;
try
for i:=0 to 1 do
begin
IdIcmpClient1.Ping;
if (IdIcmpClient1.ReplyStatus.BytesReceived =0) or (IdIcmpClient1.ReplyStatus.TimeToLive =0) then
begin
with ADOQuery1 do
begin
{ ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='Update cbat SET 状态1="0" where id='+idh ;
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from cbat order by id ');
ADOQuery1.Open;
ADOQuery1.Locate('id',strtoint(idh),[loPartialKey]);
ADOQuery1.EnableControls;
}
ADOQuery1.Open;
ADOQuery1.edit;
ADOQuery1.FieldByName('状态1').value:='0';
ADOQuery1.Post;
end;
end
else
begin
with ADOQuery1 do
begin
{ ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Text:='Update cbat SET 状态1="1" where id='+idh ;
ADOQuery1.ExecSQL;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from cbat order by id ');
ADOQuery1.Open;
ADOQuery1.Locate('id',strtoint(idh),[loPartialKey]);
ADOQuery1.EnableControls;
}
ADOQuery1.Open;
ADOQuery1.Edit;
ADOQuery1.FieldByName('状态1').value:='1';
ADOQuery1.Post;
end;
end;
Application.ProcessMessages;
end;
finally
Button1.Enabled:=true;
end;
end;
...全文
4260 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
sczyq 2018-03-22
  • 打赏
  • 举报
回复
返回 E_FAIL状态 的原因,基本上是 ADO 驱动 OLEDB 有问题,建议通过安装 MYSQL 的 ODBC ,再通过 ODBC 去连接。
秋天之落叶 2018-03-16
  • 打赏
  • 举报
回复
我已经彻底放弃POST了,感觉这个绝对有BUG,用测试项目单独测试,很好用,一加到系统中,就问题百怪,搜尽网上的方法,基本没有可用的,简直疯了,干脆不用。
zm0916 2018-03-15
  • 打赏
  • 举报
回复
谢谢各位老师,近段时间忙,先暂时用UPDATE方式来做,抽空验证老师们的建议
doloopcn 2016-11-27
  • 打赏
  • 举报
回复
在OPEN后加一句FIRST,即: With ADOQuery1 do begin Open; First; Edit; ..... Post; end;
菜鸟求指点 2016-11-14
  • 打赏
  • 举报
回复
POS貌似只会更新DBGRID,试试applyupdates看看
lizjf 2016-11-10
  • 打赏
  • 举报
回复
用ado.UpdateBatch(arall);
jinhx 2016-11-10
  • 打赏
  • 举报
回复
简单看了下 一、没看出来你的 for 起了什么作用,你没有定位行,也许我看的不仔细; 二、数据库字段尽量不要用中文; 三、WIN7的有些设置和XP是不一样的,比如日期格式就会造成整个软件崩溃; 四、adoquery除了查询语句等必须设置外,不要修改诸如locktype等任何设置; 五、注意你的查询语句,联合查询结果在不同的环境下会有不同的效果,如果你想直接编辑数据,尽量避免联合查询,包括联合查询的视图。
不得闲 2016-11-10
  • 打赏
  • 举报
回复
如果用了缓存数据模式,需要使用缓存模式提交,Post提交只是提交到缓存,不会提交到数据库的,要提交到数据库,需要有ApplyUpdate等之类的函数
lyhoo163 2016-11-10
  • 打赏
  • 举报
回复
通过ADOConnection连接数据库,都 需要SQL进行更新操作,数据集的Post语句,只能更新 DBGrid的数据。
juno_393 2016-11-09
  • 打赏
  • 举报
回复
看一下数据集是否已经修改了。另外价格updatebatch(arall)试试
zzlovelyboy 2016-10-29
  • 打赏
  • 举报
回复
locktype选择的是什么!!!
yellowlongriver 2016-10-26
  • 打赏
  • 举报
回复
ADOQuery1.SQL.Text:='Update cbat SET 状态1="0" where id='+idh ; 状态1="0"应该是状态1=‘’0‘’ 0两侧分别用两个单引号 另外, with ADOQuery1 do begin ADOQuery1.Close; //ADOQuery1可以省略 Close;//这样写即可,with..do语句的目的就是为了省略 ...... end;
afryni 2016-07-18
  • 打赏
  • 举报
回复
Adoquery1.UpdateBatch(arall); 用这个试试
y8802 2016-06-12
  • 打赏
  • 举报
回复
你的语句中只是修改第一条数据的'状态1',而不是指定ID的那行数据'状态1'
qq_35265196 2016-06-09
  • 打赏
  • 举报
回复
windows7失败啊.运行不了
zm0916 2016-06-08
  • 打赏
  • 举报
回复
基本上可以确定 post只能修改ADOQuery的表,没有修改数据库
zm0916 2016-06-08
  • 打赏
  • 举报
回复
多次尝试 无效,望高手指点迷津
dfoversky 2016-06-07
  • 打赏
  • 举报
回复
能不能和win7系统有关
Andy-88 2016-06-07
  • 打赏
  • 举报
回复
估计没关系 我这也有win7 完全没问题
zm0916 2016-06-01
  • 打赏
  • 举报
回复
忘了说了 是用delphi7开发的

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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