各位大哥,我的程序是用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"这是什么意思啊?有哪位大哥,也出现这种情况吗?在线等您指教!!!
不过一般insert的时候不会出这种问题的,
有触发器么?
也就是在其他地方修改了数据库,而你当前的数据集没刷新,
可以在操作之前刷新一下,比如
AdoQuery.Close;
AdoQuery.Open;
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......
数据库发生了改动,而没有反映到你前台的数据集中来,简单的说就是AdoQuery中的数据跟
数据库里的不一样,这时候就需要把前台的数据集刷新一下
Close;
Open;就是这样的操作。
直接AdoQuery.Refresh;也可以,不过在多表查询的时候会有一些问题。
Close;Open;基本没问题的。
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.
那样不用Append,只要焦点离开所在行,
你往输入的值就自动提交到数据库里了。
Append多此一举,还会出错。
反正这里Append操作是多余了,删掉吧。btw:拜托不要叫的这么肉麻:)
//adoquery2.Append
else
// adoquery2.Next; end
这样后增加数据时还是提示原来的错误::"row cannot be located for updating.some values may have been changed since it was last read"请问另有其它办法吗?
用insert语句插入行么?
可以放一些Edit,在Edit中输入值后点击某个按钮执行插入语句。