各位大哥,我的程序是用delphi+sql server做的,当时用的是odbc和bde来配置连接数据库的,如今我在delphi7中把这个程序改为用ado控件(用了adoconnection代替database,adoquery代替query,并在代码中把所有query用adoquery来代替)来连接数据库。运行程序,当对数据库进行添加操作时,便出现错误提示:"row cannot be located for updating.some values may have been changed since it was last read"这是什么意思啊?有哪位大哥,也出现这种情况吗?在线等您指教!!!

解决方案 »

  1.   

    是不是你在其他地方操作了数据库,但是这里没有刷新?
    不过一般insert的时候不会出这种问题的,
    有触发器么?
      

  2.   

    没有触发器,只是我同时把原来的那个用bde,odbc做的程序还用bde,odbc连接着同一个数据库。请问到底是什么原因啊
      

  3.   

    出这种问题就是你当前的数据集和数据库中不一致
    也就是在其他地方修改了数据库,而你当前的数据集没刷新,
    可以在操作之前刷新一下,比如
    AdoQuery.Close;
    AdoQuery.Open;
      

  4.   

    并在代码中把所有query用adoquery来代替两者对数据库操作不完全相同
      

  5.   

    BDE和ADO完全可以在一起用的。我中间层也是混用的。建议单独做个ADO的测试程序试一下是否还是有同样0问题,如果有就肯定是ADO的问题了,这样更有针对性。
      

  6.   

    heixiu大哥,我程序代码每次使用query时,均使用了以close的,请你看:
     adoquery1.Close;
            adoquery1.SQL.Clear;
            adoquery1.sql.text:='select distinct st_sclass from  t_sports_class';
           try
                    adoquery1.open;
           except
                    begin
                            showmessage('提取数据出错!');
                            exit;
                    end;
            end;
    ......
    ....
            adoquery2.Close;
            adoquery2.SQL.Clear;
            adoquery2.sql.text:='select * from  t_sports_class where st_sclass='+''''+combobox1.Text+'''';
           try
                    adoquery2.open;
           except......
      

  7.   

    各位大哥,我现在把bde里连接数据库的别名都delete了,现在只有我在修改用ado的在连接数据库,在应用程序中增加数据时还是出现这个错误。不过确定这个错误后,增加的数据却已经记录到数据库里去了,这是什么原因啊?
      

  8.   

    不是close的问题,是在你对数据库进行添加操作之前,
    数据库发生了改动,而没有反映到你前台的数据集中来,简单的说就是AdoQuery中的数据跟
    数据库里的不一样,这时候就需要把前台的数据集刷新一下
    Close;
    Open;就是这样的操作。
    直接AdoQuery.Refresh;也可以,不过在多表查询的时候会有一些问题。
    Close;Open;基本没问题的。
      

  9.   

    var
      f_createsclass: Tf_createsclass;
      xuenian:string;
    banming:string;
      teacher:string;
      flag:string;
    implementationprocedure Tf_createsclass.FormShow(Sender: TObject);
    var
            i:integer;
    begin
            RadioGroup1.ItemIndex:=0;
            adoquery1.Close;
            adoquery1.SQL.Clear;
            adoquery1.sql.text:='select distinct st_sclass from  t_sports_class';
           try
                    adoquery1.open;
           except
                    begin
                            showmessage('提取数据出错!');
                            exit;
                    end;        end;
            combobox1.Clear;
            adoquery1.First;
            for i:=0 to adoquery1.RecordCount-1 do
            begin
                    combobox1.Items.Add(adoquery1.fieldByname('st_sclass').asstring);
                    adoquery1.Next
            end;
            combobox1.ItemIndex:=0;
            adoquery2.Close;
            adoquery2.SQL.Clear;
            adoquery2.sql.text:='select * from  t_sports_class where st_sclass='+''''+combobox1.Text+'''';
           try
                    adoquery2.open;
           except
                    begin
                            showmessage('提取数据出错!');
                            exit;
                    end;        end;
    end;procedure Tf_createsclass.DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
            if key=13 then
            begin
                    if dbgrid1.SelectedIndex=3  then
                    begin
                       if RadioGroup1.ItemIndex=0 then
                            adoquery2.Append
                       else
                            adoquery2.Next;                end
                    else
                       key:=9;        //st_sort_nbr
            end;end;procedure Tf_createsclass.ADOQuery2NewRecord(DataSet: TDataSet);
    begin
                    adoquery2.fieldbyname('year').asstring:=xuenian;
                    adoquery2.fieldbyname('st_sclass').asstring:=banming;
                    adoquery2.fieldbyname('st_teacher').asstring:=teacher;
                    adoquery2.fieldbyname('st_highn').asstring:=flag;
                    dbgrid1.SetFocus;
                    dbgrid1.SelectedIndex:=3;
    end;procedure Tf_createsclass.ADOQuery2AfterPost(DataSet: TDataSet);
    begin                xuenian:=adoquery2.fieldbyname('year').asstring;
                    banming:=adoquery2.fieldbyname('st_sclass').asstring;
                    teacher:=adoquery2.fieldbyname('st_teacher').asstring;
                    flag:=adoquery2.fieldbyname('st_highn').asstring;        adoquery2.Close;
            adoquery2.SQL.Clear;
            adoquery2.sql.text:='select * from  t_sports_class where st_sclass='+''''+banming+'''';
           try
                    adoquery2.open;
           except
                    begin
                            showmessage('提取数据出错!');
                            exit;
                    end;        end;
    end;procedure Tf_createsclass.ADOQuery2AfterScroll(DataSet: TDataSet);
    begin                xuenian:=adoquery2.fieldbyname('year').asstring;
                    banming:=adoquery2.fieldbyname('st_sclass').asstring;
                    teacher:=adoquery2.fieldbyname('st_teacher').asstring;
                    flag:=adoquery2.fieldbyname('st_highn').asstring;
                    dbgrid1.SetFocus;
                    dbgrid1.SelectedIndex:=3;end;procedure Tf_createsclass.ComboBox1Change(Sender: TObject);
    begin
            adoquery2.Close;
            adoquery2.SQL.Clear;
            adoquery2.sql.text:='select * from  t_sports_class where st_sclass='+''''+ComboBox1.Text+'''';
           try
                    adoquery2.open;
           except
                    begin
                            showmessage('提取体育班数据出错!');
                            exit;
                    end;        end;
    end;
    end.
      

  10.   

    没有用事务,而且每次运行程序后,只要增加一条数据记录就提示出错::"row cannot be located for updating.some values may have been changed since it was last read"确定之后,再增加数据记录就出现了“违反了PRIMARY KEY”约束‘PK_T_sports_class’。不能在对象‘T_sports_class’中插入重复键  的错误,之后再也不能增加数据记录了。注:T_sports_class是我的sql server中的一个表,就是往这个表中增加数据的。
      

  11.   

    你是在DBGrid里输入的新纪录么?
    那样不用Append,只要焦点离开所在行,
    你往输入的值就自动提交到数据库里了。
    Append多此一举,还会出错。
      

  12.   

    heixiu哥哥,我是在dbgrid里直接输入新记录的,是不是因为用了append所以才会出现这种错误?那为什么我以前用query和bde时却没有这种错误呢?
      

  13.   

    query的机理我不太熟,可能提交的方式不太一样
    反正这里Append操作是多余了,删掉吧。btw:拜托不要叫的这么肉麻:)
      

  14.   

    我以前是用d5编的,现在用的是d7来修改的,楼上的哥哥你说我最好还用d5来修改吗?但我delete delphi7后,装上d5后,打开这个ado程序后居然提示说有错识,不合法,唉,这又是个不知道什么原因的错识。
      

  15.   

    :),heixiu学长,直接 if RadioGroup1.ItemIndex=0 then
                            //adoquery2.Append
                       else
                          //  adoquery2.Next;                end
    这样后增加数据时还是提示原来的错误::"row cannot be located for updating.some values may have been changed since it was last read"请问另有其它办法吗?
      

  16.   

    晕倒...
    用insert语句插入行么?
      

  17.   

    用insert插入?heixiu学长,在哪个地方操作?可否具休一点?:)
      

  18.   

    就是不要在DBGrid上输入了
    可以放一些Edit,在Edit中输入值后点击某个按钮执行插入语句。
      

  19.   

    学长,说得有道理,我会试试这个办法。再问一下上面的程序代码中ADOQuery2NewRecord,ADOQuery2afterpost,ADOQuery2afterscroll这三段是什么到底意思啊?具休的是依次对数据库进行了什么的操作?