2013-10-17 64 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;