答案 0 :(得分:5)
通常,这意味着以下之一:
dmNutsData
是nil
dmNutsData.qry
是nil
dmNutsData.qry.SQL
是nil
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;