2013-10-04 22 views
1

我一直在努力讓這個過程在過去的5個小時內工作。我已經嘗試將它修剪下來,直到它能夠工作並在此基礎上建立起來,但仍然沒有結束。我非常感謝一些幫助,因爲我必須在明天上午以工作狀態介紹這個項目。德爾福的SQL更新過程沒有更新

我修剪了我的代碼(因爲它很長),但問題仍然很明顯。

sqlCon.Connected := true; //TSQLConnection 
sqlUsers.Active := true; //TSQLTable 
sqlGames.Active := true; //TSQLTable 
sqlPredictions.Active := true; //TSQLTable 

sqlUsers.First; 

//All following variables are integers. 

rugbyChampionshipScore := 10; 
rugbyChampionshipGamesPredicted:= 10; 
rugbyChampionshipGamesCorrect:= 10; 
rugbyChampionshipGamesAlmost:= 10; 
rugbyChampionshipGamesWrong:= 10; 
currieCupScore := 10; 
currieCupGamesPredicted := 10; 
currieCupGamesCorrect := 10; 
currieCupGamesAlmost := 10; 
currieCupGamesWrong := 10; 

sqlQueryUpdate.Close; //TSQLQuery 

sqlQueryUpdate.CommandText := 'UPDATE users SET overallScore=:parScore, overallGamesPredicted=:parGamesPredicted, overallGamesCorrect=:parGamesCorrect, overallGamesAlmost=:parGamesAlmost, overallGamesWrong=:parGamesWrong, overallAccuracy=:parAccuracy WHERE username=:parUsername'; 
sqlQueryUpdate.Params.Clear; 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parUsername', ptUnknown).AsString := sqlUsers.FieldByName('username').AsString; 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parScore', ptUnknown).AsInteger := Round((rugbyChampionshipScore + currieCupScore)/(rugbyChampionshipGamesPredicted + currieCupGamesPredicted)); 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parGamesPredicted', ptUnknown).AsInteger := rugbyChampionshipGamesPredicted + currieCupGamesPredicted; 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parGamesCorrect', ptUnknown).AsInteger := rugbyChampionshipGamesCorrect + currieCupGamesCorrect; 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parGamesAlmost', ptUnknown).AsInteger := rugbyChampionshipGamesAlmost + currieCupGamesAlmost; 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parGamesWrong', ptUnknown).AsInteger := rugbyChampionshipGamesWrong + currieCupGamesWrong; 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parAccuracy', ptUnknown).AsInteger := Round(100/(rugbyChampionshipGamesPredicted + currieCupGamesPredicted)*(rugbyChampionshipGamesCorrect + currieCupGamesCorrect) + ((rugbyChampionshipGamesAlmost + currieCupGamesAlmost)/2)); 

sqlQueryUpdate.ExecSQL(); 
sqlQueryUpdate.Close; 

sqlUsers.Active := false; 
sqlGames.Active := false; 
sqlPredictions.Active := false; 
+0

什麼是'sqlQueryUpdate'?它是否將'CommandType'設置爲'ctQuery'? – TLama

+0

謝謝你的回覆。 'sqlQueryUpdate'是一個'TSQLQuery'組件,我找不到'CommandType'屬性。 – Laz

+0

那麼,首先使用['SQL'](http://docwiki.embarcadero.com/Libraries/XE3/en/Data.SqlExpr.TSQLQuery.SQL)屬性​​而不是'CommandText'來指定查詢。 – TLama

回答

-1

這很奇怪。我遵循所有評論過的人的建議,並且我發現創建我的參數的順序會影響查詢。

碼不起作用:

sqlCon.Connected := true; 
sqlUsers.Active := true; 
sqlGames.Active := true; 
sqlPredictions.Active := true; 

sqlUsers.First; 

sqlQueryUpdate.Close; 

sqlQueryUpdate.SQL.Clear; 
sqlQueryUpdate.SQL.Add('UPDATE users SET overallScore=:parScore WHERE username=:parUsername'); 
sqlQueryUpdate.Params.Clear; 

sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parUsername', ptUnknown).AsString := sqlUsers.FieldByName('username').AsString; 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parScore', ptUnknown).AsInteger := 200; 


sqlQueryUpdate.ExecSQL(); 
sqlQueryUpdate.Close; 

代碼工作的:

... 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parScore', ptUnknown).AsInteger := 200; 
sqlQueryUpdate.Params.CreateParam(ftUnknown, 'parUsername', ptUnknown).AsString := sqlUsers.FieldByName('username').AsString; 
... 

所以簡單地交換那些2線使得它的工作?誰能告訴我爲什麼?我很好奇......

+0

由於@Uwe已經提到過,你不需要手動創建這些參數。讓查詢對象爲你做好這件事。你只需像sqlQueryUpdate.ParamByName('parScore')。AsInteger:= ...'那樣訪問它們,或者,如果你更喜歡更快的方式並且知道參數在查詢中出現的順序,那麼你可以使用像' sqlQueryUpdate.Params [0] .AsInteger:= ...'。 – TLama

+0

@TLama感謝您的建議。我將從現在開始使用後一種方法。 – Laz

+0

這應該是對問題的更新,而不是答案。 –