本意是想在窗口打开的时候清空某个数据表的内容,我在BUTTON上写了如下代码:
while not adoataset1.eof do
begin
adoataset1.delete;
end;
但运行时系统报错:键列信息不足或不正确,更新影响到过多的行。
我用的数据库是ACESS的,表的内容没有定义主键。有部分列值是空白。如:
编号 姓名 数量 单价 金额 备注 小张 3 3
其中金额是计算型的,由数量*单价得出值,(数据表本身没有金额这个字段,我想可能这是原因所在)。
但报错后我继续按F9键运行,数据表的内容就清空了。请各位前辈指导一下,怎样才使其不报错。谢谢。
while not adoataset1.eof do
begin
adoataset1.delete;
end;
但运行时系统报错:键列信息不足或不正确,更新影响到过多的行。
我用的数据库是ACESS的,表的内容没有定义主键。有部分列值是空白。如:
编号 姓名 数量 单价 金额 备注 小张 3 3
其中金额是计算型的,由数量*单价得出值,(数据表本身没有金额这个字段,我想可能这是原因所在)。
但报错后我继续按F9键运行,数据表的内容就清空了。请各位前辈指导一下,怎样才使其不报错。谢谢。
//数据安全删除******************************************************************
//==============================================================================
function Data_SafeDelete(DataSet: TDataSet; DBGrid: TDBGrid): Boolean;
var i: integer;//TDBDataSet是TQuery,TTable,TStoredProc的直接父类
begin
Result := false;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//TDBDataSet是TQuery,TTable,TStoredProc的直接父类(两层结构)*******************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (DataSet is TDBDataSet) then
begin
if DBGrid<>nil//如果是从DBGRid中执行删除
then try
for i:=1 to DBGrid.SelectedRows.Count do
begin//多行选择
(DataSet as TDBDataSet).GotoBook(Pointer(DBGrid.SelectedRows.Items[i-1]));
(DataSet as TDBDataSet).Delete;
end;
except
Abort;
end
else (DataSet as TDBDataSet).Delete;
//==========================================================================
//提交到数据库服务器********************************************************
//==========================================================================
if (DataSet as TDBDataSet).Database.InTransaction then (DataSet as TDBDataSet).Database.Rollback;
(DataSet as TDBDataSet).Database.StartTransaction;//开始提交一个事务
try
(DataSet as TDBDataSet).ApplyUpdates;//把缓存中未决的记录写到数据集中
(DataSet as TDBDataSet).Database.Commit;//把调用StartTransaction以来所有的数据变化都反映到服务器上,与Query_Main.Database.Rollback相反
Result := true;
except
(DataSet as TDBDataSet).CancelUpdates;
(DataSet as TDBDataSet).Database.Rollback;//把调用StartTransaction以来所有的数据变化都取消,与Query_Main.Database.Commit相反
Result := false;
end;
(DataSet as TDBDataSet).CommitUpdates;
end
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//TClientDataSet远程更新(三层结构)********************************************
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
else if (DataSet is TClientDataSet) then
begin
if DBGrid<>nil//如果是从DBGRid中执行删除
then try
for i:=1 to DBGrid.SelectedRows.Count do
begin//多行选择
(DataSet as TClientDataSet).GotoBook(Pointer(DBGrid.SelectedRows.Items[i-1]));
(DataSet as TClientDataSet).Delete;
end;
except
Abort;
end
else (DataSet as TClientDataSet).Delete;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
if (DataSet as TClientDataSet).ApplyUpdates(0)=0 then
begin
Result := true;
end else
begin
Result := false;
Abort;
end;
end;
end;
while not adoataset1.eof do
begin
adoataset1.delete;
adoataset1.Next;
end;
或直接用SQL语句’delete table';
delete from tablename