本人初学,采用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;

解决方案 »

  1.   

    忘了说了  是用delphi7开发的
      

  2.   

    能不能和win7系统有关
      

  3.   

    估计没关系   我这也有win7 完全没问题
      

  4.   

    基本上可以确定  post只能修改ADOQuery的表,没有修改数据库
      

  5.   

    windows7失败啊.运行不了
      

  6.   

    Adoquery1.UpdateBatch(arall);  用这个试试
      

  7.   

    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;
      

  8.   

    locktype选择的是什么!!!
      

  9.   

    看一下数据集是否已经修改了。另外价格updatebatch(arall)试试
      

  10.   

    通过ADOConnection连接数据库,都 需要SQL进行更新操作,数据集的Post语句,只能更新 DBGrid的数据。
      

  11.   

    如果用了缓存数据模式,需要使用缓存模式提交,Post提交只是提交到缓存,不会提交到数据库的,要提交到数据库,需要有ApplyUpdate等之类的函数
      

  12.   

    简单看了下
    一、没看出来你的 for 起了什么作用,你没有定位行,也许我看的不仔细;
    二、数据库字段尽量不要用中文;
    三、WIN7的有些设置和XP是不一样的,比如日期格式就会造成整个软件崩溃;
    四、adoquery除了查询语句等必须设置外,不要修改诸如locktype等任何设置;
    五、注意你的查询语句,联合查询结果在不同的环境下会有不同的效果,如果你想直接编辑数据,尽量避免联合查询,包括联合查询的视图。
      

  13.   

    用ado.UpdateBatch(arall);
      

  14.   

    POS貌似只会更新DBGRID,试试applyupdates看看
      

  15.   

    在OPEN后加一句FIRST,即:
    With ADOQuery1 do
    begin
    Open;
    First;
    Edit;
    .....
    Post;
    end;
      

  16.   

    谢谢各位老师,近段时间忙,先暂时用UPDATE方式来做,抽空验证老师们的建议
      

  17.   

    我已经彻底放弃POST了,感觉这个绝对有BUG,用测试项目单独测试,很好用,一加到系统中,就问题百怪,搜尽网上的方法,基本没有可用的,简直疯了,干脆不用。
      

  18.   

    返回 E_FAIL状态 的原因,基本上是 ADO 驱动 OLEDB 有问题,建议通过安装 MYSQL 的 ODBC ,再通过 ODBC 去连接。