2013-10-17 60 views
1

我不知道如果你能帮我解决一个非常简单的问题,我似乎解决了。SQL更新(德尔福)

基本上,我在Delphi 7中创建了一个投票系统。用户选中复选框投票“是”之后,我需要通过增加“是投票”字段来更新我的表“规则”。

这里是问题出在哪里,出于某种原因,表是总是增加值2而不是1!

无论如何请协助,我很新,所以请耐心等待。

这里是我的代码: (注:“再见”是从一个复选框值的布尔 “RuleID”被链接到一定的规则一个字段名到付诸表决)

if bYes = True then 
begin 
    qry1.Active := False; 
    qry1.SQL.Text := 'UPDATE rules SET [Yes votes] = [yes votes] + 1 WHERE ruleid = "1"'; 
    qry1.ExecSQL; 
    qry1.Active := True; 
end 
else 
    qry1.close; 
qry1.SQL.Text := 'UPDATE rules SET [no votes] = [no votes] + 1 WHERE ruleid = "1"'; 
qry1.ExecSQL; 
qry1.Open; 
+3

除了缺乏的'在else分支中开始,结束'qry1.Open'或'qry1.Active = True'应该被删除,因为这会导致组件的额外执行,然后依赖于组件的错误。你只需要使用qry1.ExecSQL。 – bummi

+1

@bummi:这就是为什么:'问题:表总是增加一个值2而不是1!'。您的评论应该是答案。 –

+0

安全提示:不要忘记使用SQL参数;) –

回答

2

缩进你的代码就会发现你已经错过了begin/end您else块:

if bYes = True then 
begin 
    qry1.Active := False; 
    qry1.SQL.Text := 'UPDATE rules SET [Yes votes] = [yes votes] + 1 WHERE ruleid = "1"'; 
    qry1.ExecSQL; 
    qry1.Active := True; 
end 
else 
    qry1.close; 
qry1.SQL.Text := 'UPDATE rules SET [no votes] = [no votes] + 1 WHERE ruleid = "1"'; 
qry1.ExecSQL; 
qry1.Open; 

此外,您应该确保qry1.Activeqry1.Open不执行查询的额外执行。

+0

你打我几秒钟:) –

+2

问题:'表总是增加值2而不是1!'。在你的代码中,你和OP一样犯了一个错误。在更改'sql'之前做'qry1.Open;'! –

8

根据组件设置qry1.Active := True;qry1.Open;将第二次执行sql,并且取决于组件会在执行后引发额外的异常。您只需在begin .. end区块内拨打qry1.ExecSQL;即可。

begin 
    if byes then // omitt = True 
    begin 
    qry1.SQL.Text := 'UPDATE rules SET [Yes votes] = [yes votes] + 1 WHERE ruleid = "1"'; 
    qry1.ExecSQL; 
    end 
    else 
    begin 
    qry1.SQL.Text := 'UPDATE rules SET [no votes] = [no votes] + 1 WHERE ruleid = "1"'; 
    qry1.ExecSQL; 
    end; 
end; 

调用的另一种方式可能是

begin 
    if byes then // omitt = True 
    qry1.SQL.Text := 'UPDATE rules SET [Yes votes] = [yes votes] + 1 WHERE ruleid = "1"' 
    else 
    qry1.SQL.Text := 'UPDATE rules SET [no votes] = [no votes] + 1 WHERE ruleid = "1"'; 
    qry1.ExecSQL; 

end; 
0

真正的问题是不缺少的开始结束 这是该SQL命令被执行2次

if bYes = True then 
    begin 
    qry1.Active := False; 
    qry1.SQL.Text := 'UPDATE rules SET [Yes votes] = [yes votes] + 1 WHERE ruleid = "1"'; 
    qry1.ExecSQL;   // Execute #1 
    qry1.Active := True; // probably a Execute #2 
    end 
else 
    begin 
    qry1.close; 
    qry1.SQL.Text := 'UPDATE rules SET [no votes] = [no votes] + 1 WHERE ruleid = "1"'; 
    qry1.ExecSQL;   // Rxecute #1 
    qry1.Open;    // probably a Execute #2 
    end;