Delphi-地址0051BC48的访问冲突

时间:2018-07-26 08:29:11

标签: delphi

enter image description here

我已经创建了“ qry”作为私有变量。我已经尝试修复此错误一段时间了。我正在使用的代码是:

httpRequest.ContentLength

2 个答案:

答案 0 :(得分:5)

通常,这意味着以下之一:

  • dmNutsDatanil
  • dmNutsData.qrynil
  • dmNutsData.qry.SQLnil
  • qry不是dmNutsData的成员,但在其他地方声明,并且是nil

使用调试器找出它所在的位置。遍历代码并检查值以查看哪个是nil

我强烈建议您不要以这种方式使用with。这样做可能会导致意外的作用域冲突,并且也使程序难以调试。如果要避免重复编写dmNutsData.qry,请声明一个局部变量,然后为其分配``dmNutsData.qry`。

最后,您的程序就像之前的很多程序一样,很容易受到SQL注入的影响。不要落入那个陷阱。使用参数。

答案 1 :(得分:2)

除了@DavidHeffernan的答案中提到的要点外,INSERT语句中至少还有四个语法错误。根据您正在使用的查询组件的类型(您未声明),至少会导致报告您的AV,或者至少导致INSERT失败。

在您的     qry.SQL.Add('INSERT INTO CompnayList(CompanyID,CompanyName,CompanyNumber,CompanyEmail,');

  • 首先,大概CompnayList应该读为CompanyList。我在您未回复的评论中提到了这一点。

  • 其次,在“ CompanyEmail”之后的SQL语句中不应包含逗号

  • 第三,在“ CompanyEmail”之后应该有一个closong括号

因此,更正后的版本应为

qry.SQL.Add('INSERT INTO Comp**an**yList (CompanyID, CompanyName, CompanyNumber, CompanyEmail)') ;

接下来,您的SQL

qry.SQL.Add('Values (edtCompID.Text, edtCompName.Text, edtCompNumb.Text, edtCompanyEmail.Text') ;

再次缺少右括号,并且如果您打算访问edtCompID的文本,说明操作不正确,该行应显示为

qry.SQL.Add('Values (' + edtCompID.Text + ', ' + edtCompName.Text + ', ' +  edtCompNumb.Text + ', ' + edtCompanyEmail.Text + ')') ;

正如David所说,最好对SQL语句进行参数化设置,但这不仅是因为存在SQL注入的风险。

顺便说一句,通过使用对qry.SQL.Add()的调用来构建SQL语句,您使事情更容易出错。这是因为外部括号使您很难在要添加的文本中发现错误,尤其是在假定文本包含其自己的括号的情况下。最好使用字符串变量作为临时“持有人”,以在构建SQL时接收该SQL,然后将其完成后,将其分配给qry的Sql.Text属性,像这样

var
  S : String;
begin
  [...]
  S := 'select * from mytable';
  qry.SQL.Text := S;
  qry.Open;
  [...]
end;