2013-10-04 20 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

这应该是对问题的更新,而不是答案。 –