【问题标题】:Delphi syntax error in FROM clause but - there's no FROM clauseFROM 子句中的 Delphi 语法错误,但是 - 没有 FROM 子句
【发布时间】:2019-04-20 14:23:21
【问题描述】:

我在 Delphi 的 SQL 代码中使用插入函数。程序编译并运行,但是,单击执行插入功能的按钮后,我收到一条消息,说

FROM 子句中的语法错误。

在中断程序时,它会突出显示end 之前的最后一行代码。如果我要删除那行代码并重新运行程序,我会遇到同样的错误,并且在破坏它时会突出显示 buttonclick 过程的end;

请记住,我仍然是这门语言的学生和新手。

ADOQuery1.Close;
ADOQuery1.SQL.Add('insert into FPS_Tbl([MatchID],[kills],[standings],[GrenadeKill],[TimePlayed],[Username],[Comments],[Headshots],[Dates])');
ADOQuery1.SQL.Add('values("'+IntToStr(ids)+'","'+IntToStr(Kills)+'","'+standings+'","'+IntToStr(grenKills)+'","'+times+'","'+user+'","'+comment+'","'+IntToStr(HedShots)+'","'+DateToStr(Now)+'");');
ADOQuery1.ExecSQL;

end;
recalls;

recalls 是在 Richedit 中显示表格内容的过程。

不太确定为什么会收到此错误,因为我的 SQL 语句中没有“From”子句。非常感谢那些提供帮助的人。

【问题讨论】:

  • 注意SQL注入!
  • 抱歉,我不知道什么是 sql 注入,但我已经找到了它无法正常工作的原因......但我感谢您的输入
  • 查看here 了解有关严重安全问题的详细信息。当然与问题无关,但值得一看。
  • 在这种情况下,您的 FROM 子句实际上是 VALUES 列表。我认为这些值应该由独立于 DBMS 的单引号而不是双引号引起来,所以请尝试一下 - 在这种情况下,您需要知道如何在 Add 方法中转义单引号,或者尝试在那里使用双引号。
  • 你为什么在那里使用Add()?由于您没有清除那里的Tstrings,它总是会在另一个语句中添加INSERT 语句,依此类推。请使用参数而不是串联字符串。为什么recalls;end; 之后?

标签: sql syntax-error delphi-2010


【解决方案1】:

在调用多行 SQL 查询时,您需要先Clear() SQL 然后再向它添加 Add() 行,否则您将添加到 previous 查询:

ADOQuery1.Close;
ADOQuery1.SQL.Clear; // <-- ADD THIS!!!
ADOQuery1.SQL.Add('insert into FPS_Tbl([MatchID],[kills],[standings],[GrenadeKill],[TimePlayed],[Username],[Comments],[Headshots],[Dates])');
ADOQuery1.SQL.Add('values("' + IntToStr(ids) + '","' + IntToStr(Kills) + '","' + standings + '","' + IntToStr(grenKills) + '","' + times + '","' + user + '","' + comment + '","' + IntToStr(HedShots) + '","' + DateToStr(Now) + '");');
ADOQuery1.ExecSQL;

否则,请改用Text 属性:

ADOQuery1.Close;
ADOQuery1.SQL.Text := 'insert into FPS_Tbl([MatchID],[kills],[standings],[GrenadeKill],[TimePlayed],[Username],[Comments],[Headshots],[Dates]) values("' + IntToStr(ids) + '","' + IntToStr(Kills) + '","' + standings + '","' + IntToStr(grenKills) + '","' + times + '","' + user + '","' + comment + '","' + IntToStr(HedShots) + '","' + DateToStr(Now) + '");');
ADOQuery1.ExecSQL;

也就是说,您的代码受到SQL Injection 攻击。您可以通过对所有字符串输入使用 AnsiQuotedStr() 来避免这种情况:

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('insert into FPS_Tbl([MatchID],[kills],[standings],[GrenadeKill],[TimePlayed],[Username],[Comments],[Headshots],[Dates])');
ADOQuery1.SQL.Add('values("' + IntToStr(ids) + '","' + IntToStr(Kills) + '",' + AnsiQuotedStr(standings,'"') + ',"' + IntToStr(grenKills) + '",' + AnsiQuotedStr(times,'"') + ',' + AnsiQuotedStr(user,'"') + ',' + AnsiQuotedStr(comment,'"') + ',"' + IntToStr(HedShots) + '","' + DateToStr(Now) + '");');
ADOQuery1.ExecSQL;

或者更好的是,改用parameterized query

ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('insert into FPS_Tbl([MatchID],[kills],[standings],[GrenadeKill],[TimePlayed],[Username],[Comments],[Headshots],[Dates])');
ADOQuery1.SQL.Add('values(:PId,:PKills,:PStandings,:PGrenKills,:PTimes,:PUser,:PComment,:PHeadShots,:PDate);');
ADOQuery1.Parameters.ParamByName('PId').Value := IntToStr(ids);
ADOQuery1.Parameters.ParamByName('PKills').Value := IntToStr(Kills);
ADOQuery1.Parameters.ParamByName('PStandings').Value := standings;
ADOQuery1.Parameters.ParamByName('PGrenKills').Value := IntToStr(grenKills);
ADOQuery1.Parameters.ParamByName('PTimes').Value := times;
ADOQuery1.Parameters.ParamByName('PUser').Value := user;
ADOQuery1.Parameters.ParamByName('PComment').Value := comment;
ADOQuery1.Parameters.ParamByName('PHeadShots').Value := IntToStr(HedShots);
ADOQuery1.Parameters.ParamByName('PDate').Value := DateToStr(Now);
ADOQuery1.ExecSQL;

【讨论】:

    【解决方案2】:

    尝试插入简单的空格来分隔(第一次添加中的最后一个单词)和(第二次添加中的第一个单词),可能是这样的:

    ADOQuery1.SQL.Add(' values("'+IntToStr(ids)+'","'+IntToStr(Kills)+'","'+standings+'","'+IntToStr(grenKills)+'","'+times+'","'+user+'","'+comment+'","'+IntToStr(HedShots)+'","'+DateToStr(Now)+'");');
    

    【讨论】:

      猜你喜欢
      • 2022-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多