为什么在下面的事件中,有时会出现“无法更新;当前被锁定”的信息,有时又正常的呢? if DBGrid1.SelectedRows.Count <= 0 then
Exit; Self.Enabled:=false;
DBGrid1.DataSource.DataSet.DisableControls;
try
for i:=0 to DBGrid1.SelectedRows.Count-1 do
begin
DBGrid1.DataSource.DataSet.GotoBook(pointer(DBGrid1.SelectedRows.Items[i]));
if IsMobile(Trim(DBGrid1.DataSource.DataSet.FieldByName('手机').AsString)) then
begin
Application.ProcessMessages;
MainForm.N28.Click; //调用某事件,此事件会返回SendStatus
if SendStatus=0 then
TrueFalse:='true'
else
TrueFalse:='false'; ADOQuery7.Close; //将上面的结果插入表中
ADOQuery7.SQL.Clear;
ADOQuery7.SQL.Add('insert into 生日表(编号,姓名,手机,生日时间,厂家,型号,车牌号码,发送时间,类型,状态) values('
+ADOQuery2.FieldByName('编号').AsString+','
+#39+ADOQuery2.FieldByName('姓名').AsString+#39+','
+#39+ADOQuery2.FieldByName('手机').AsString+#39+','
+#39+ADOQuery2.FieldByName('生日时间').AsString+#39+','
+#39+ADOQuery2.FieldByName('厂家').AsString+#39+','
+#39+ADOQuery2.FieldByName('型号').AsString+#39+','
+#39+ADOQuery2.FieldByName('车牌号码').AsString+#39+','
+#39+DateTimeToStr(Now)+#39+','
+#39+'新历'+#39+','+TrueFalse+')');
ADOQuery7.ExecSQL;
ADOQuery2.Delete; // 此DBGrid1 所对应的DataSet
end;
end;
DBGrid1.DataSource.DataSet.EnableControls;
Self.Enabled:=true;
Edit2.SetFocus;
DBGrid1.SetFocus;
except
on E: Exception do
begin
DBGrid1.DataSource.DataSet.EnableControls;
Self.Enabled:=true;
Edit2.SetFocus;
DBGrid1.SetFocus;
MessageBox(Handle,PChar(E.Message),'提示',MB_ICONWARNING);
Exit;
end;
end;
DBGrid1.DataSource.DataSet.EnableControls;
Self.Enabled:=true;
Edit2.SetFocus;
DBGrid1.SetFocus;
Exit; Self.Enabled:=false;
DBGrid1.DataSource.DataSet.DisableControls;
try
for i:=0 to DBGrid1.SelectedRows.Count-1 do
begin
DBGrid1.DataSource.DataSet.GotoBook(pointer(DBGrid1.SelectedRows.Items[i]));
if IsMobile(Trim(DBGrid1.DataSource.DataSet.FieldByName('手机').AsString)) then
begin
Application.ProcessMessages;
MainForm.N28.Click; //调用某事件,此事件会返回SendStatus
if SendStatus=0 then
TrueFalse:='true'
else
TrueFalse:='false'; ADOQuery7.Close; //将上面的结果插入表中
ADOQuery7.SQL.Clear;
ADOQuery7.SQL.Add('insert into 生日表(编号,姓名,手机,生日时间,厂家,型号,车牌号码,发送时间,类型,状态) values('
+ADOQuery2.FieldByName('编号').AsString+','
+#39+ADOQuery2.FieldByName('姓名').AsString+#39+','
+#39+ADOQuery2.FieldByName('手机').AsString+#39+','
+#39+ADOQuery2.FieldByName('生日时间').AsString+#39+','
+#39+ADOQuery2.FieldByName('厂家').AsString+#39+','
+#39+ADOQuery2.FieldByName('型号').AsString+#39+','
+#39+ADOQuery2.FieldByName('车牌号码').AsString+#39+','
+#39+DateTimeToStr(Now)+#39+','
+#39+'新历'+#39+','+TrueFalse+')');
ADOQuery7.ExecSQL;
ADOQuery2.Delete; // 此DBGrid1 所对应的DataSet
end;
end;
DBGrid1.DataSource.DataSet.EnableControls;
Self.Enabled:=true;
Edit2.SetFocus;
DBGrid1.SetFocus;
except
on E: Exception do
begin
DBGrid1.DataSource.DataSet.EnableControls;
Self.Enabled:=true;
Edit2.SetFocus;
DBGrid1.SetFocus;
MessageBox(Handle,PChar(E.Message),'提示',MB_ICONWARNING);
Exit;
end;
end;
DBGrid1.DataSource.DataSet.EnableControls;
Self.Enabled:=true;
Edit2.SetFocus;
DBGrid1.SetFocus;
如果是的话,出现这样的错误提示,多数是因为更新的冲突
即对当前记录进行操作的同时又企图更新之
为什么有时可以正常,有时会出现更新冲空,如何解决呢?
首先,从循环的角度看,如果在循环中要删除循环体内的记录,那么
for i:=0 to DBGrid1.SelectedRows.Count-1 do
就应该修改为:for i:=DBGrid1.SelectedRows.Count-1 downto 0 do
这样才能保证所有的记录被遍历到 其次,DBGrid1.DataSource.DataSet.GotoBook(pointer(DBGrid1.SelectedRows.Items[i])); 你往那里设置了book啊,而且也没有看见你释放book,我怀疑这个更新错误的信息不是你更新到生日表,而是删除记录时的问题,你最好单步执行一下,看是什么样的记录会出这个错
不错,上面的出错是由于删除记录时的问题,但是奇怪同一批记录,有时正常,有时会出错,出错信息如上面所述“无法更新;当前被锁定”
大家有何解决的办法呀?
如何放在一个事务中处理呀,事务好象对执行这些SQL语句是没有作用的呀'insert into 生日表……’
因为是可以直接去取得dbgrid当前选中记录中的任意一个字段值的
至于为什么同一批记录有的可以,有的不行,我觉得还是比较一下记录的差别会比较好,也许能从中发现原因
因为是可以直接去取得dbgrid当前选中记录中的任意一个字段值的——》取得当前选中记录中的任意一个字段值??
能够实现我上面想实现的功能吗?
能提供部分源代码吗?
在此谢过。