注册和删除 ITEM 访问数据库 - Delphi
Register and delete ITEM access database - Delphi
我正在向数据库发送一个 ListView 的项目,发送后必须删除发送的项目。
注册正常执行,但我的问题是删除项目的时间。这会产生以下错误:
access violation at address 0073F82E in module "project1.exe". Read OF address 00000008
我必须做些什么才能不产生这个错误。因为它只在我尝试删除文件时发生(在数据库中注册通常会发生,直到某些项目产生此错误)。
if LstbxDados.Items.Count <= 0 then begin
exit;
end;
//try
ADOConnection1.Connected := true;
try
with ADOCommand1 do begin
CommandText := 'INSERT INTO IP (ti_ip, url_ip, ima_ip, desc_ip,id_ip, data_ip, cat_ip,cad_ip) VALUES ( :a, :b, :c, :d, :e, :f, :g, NOW() )';
for I := 0 to LstbxDados.Items.Count - 1 do begin
parameters.parambyname('a').value := Trim(LstbxDados.Items.Item[i].SubItems[0]);
parameters.parambyname('b').value := Trim(LstbxDados.Items.Item[i].SubItems[1]);
parameters.parambyname('c').value := Trim(LstbxDados.Items.Item[i].SubItems[2]);
parameters.parambyname('d').value := Trim(LstbxDados.Items.Item[i].SubItems[3]);
parameters.parambyname('e').value := Trim(LstbxDados.Items.Item[i].SubItems[4]);
if Trim(LstbxDados.Items.Item[i].SubItems[5]) <> '' then begin
parameters.parambyname('f').value := StrTodate(Trim(LstbxDados.Items.Item[i].SubItems[5]));
end else begin
parameters.parambyname('f').value := null;
end;
parameters.parambyname('g').value := Trim(LstbxDados.Items.Item[i].SubItems[6]);
Execute;
LstbxDados.Items.Delete(i);
end;
end;
finally
ADOConnection1.Connected := false;
end;
//except
// respostas(9);
//end;
正如评论中所解释的那样,发生这种情况是因为您正在假设循环中删除项目(因为
for I := 0 to LstbxDados.Items.Count - 1 do
) Items.Count 保持不变,而实际上每次删除项目时它都会减少一个。因此,第一次循环时编号为 [Count -1] 的 Item,在轮到它被删除时不再是,因为那时 Items 的数量少于 Count - 1 的初始值。
解决方案:使用
for I := LstbxDados.Items.Count - 1 downto 0 do
顺便说一句,我的第一个想法是使用 while 循环:
while LstbxDados.Items.Count > 0 do begin
但请参阅@TLama 的评论,如果您这样做的话,请注意您的 Items 数组索引。
我正在向数据库发送一个 ListView 的项目,发送后必须删除发送的项目。
注册正常执行,但我的问题是删除项目的时间。这会产生以下错误:
access violation at address 0073F82E in module "project1.exe". Read OF address 00000008
我必须做些什么才能不产生这个错误。因为它只在我尝试删除文件时发生(在数据库中注册通常会发生,直到某些项目产生此错误)。
if LstbxDados.Items.Count <= 0 then begin
exit;
end;
//try
ADOConnection1.Connected := true;
try
with ADOCommand1 do begin
CommandText := 'INSERT INTO IP (ti_ip, url_ip, ima_ip, desc_ip,id_ip, data_ip, cat_ip,cad_ip) VALUES ( :a, :b, :c, :d, :e, :f, :g, NOW() )';
for I := 0 to LstbxDados.Items.Count - 1 do begin
parameters.parambyname('a').value := Trim(LstbxDados.Items.Item[i].SubItems[0]);
parameters.parambyname('b').value := Trim(LstbxDados.Items.Item[i].SubItems[1]);
parameters.parambyname('c').value := Trim(LstbxDados.Items.Item[i].SubItems[2]);
parameters.parambyname('d').value := Trim(LstbxDados.Items.Item[i].SubItems[3]);
parameters.parambyname('e').value := Trim(LstbxDados.Items.Item[i].SubItems[4]);
if Trim(LstbxDados.Items.Item[i].SubItems[5]) <> '' then begin
parameters.parambyname('f').value := StrTodate(Trim(LstbxDados.Items.Item[i].SubItems[5]));
end else begin
parameters.parambyname('f').value := null;
end;
parameters.parambyname('g').value := Trim(LstbxDados.Items.Item[i].SubItems[6]);
Execute;
LstbxDados.Items.Delete(i);
end;
end;
finally
ADOConnection1.Connected := false;
end;
//except
// respostas(9);
//end;
正如评论中所解释的那样,发生这种情况是因为您正在假设循环中删除项目(因为
for I := 0 to LstbxDados.Items.Count - 1 do
) Items.Count 保持不变,而实际上每次删除项目时它都会减少一个。因此,第一次循环时编号为 [Count -1] 的 Item,在轮到它被删除时不再是,因为那时 Items 的数量少于 Count - 1 的初始值。
解决方案:使用
for I := LstbxDados.Items.Count - 1 downto 0 do
顺便说一句,我的第一个想法是使用 while 循环:
while LstbxDados.Items.Count > 0 do begin
但请参阅@TLama 的评论,如果您这样做的话,请注意您的 Items 数组索引。