2017-08-10 54 views
3

我一直在收到此错误,而且我正在努力寻找我做错了什么。没有意义的是,结果仍然被发布到数据库,所有字段都是正确的,除了名称字段。在名称字段中由于某种原因输入'dmInfo'。这里正在引起无法对已关闭的数据集执行此操作,并且输入的表数据不正确

with dmQuery_u.dmInfo do 
     begin 
     dsInfo.Edit; 
     qryData.SQL.Clear; 
     qryData.SQL.Add('SELECT * FROM eventinfo ORDER BY eventnumber'); 
     qryData.Open; 
     qryData.Last; 
     autonum := qryData['eventnumber'] + 1; 
     qryData.SQL.Clear; 
     qryData.SQL.Add(
      'INSERT INTO eventinfo (eventnumber, bandname, venue, dateofevent, ticketcost, openingact, amountbooked)'); 
     qryData.SQL.Add(
      'VALUES (:eventnumber, :bandname, :venue, :dateofevent, :ticketcost, :openingact, :amountbooked)'); 
     qryData.Parameters.ParamByName('eventnumber').Value := autonum; 
     qryData.Parameters.ParamByName('bandname').Value := name; 
     qryData.Parameters.ParamByName('venue').Value := venue; 
     qryData.Parameters.ParamByName('dateofevent').Value := date; 
     qryData.Parameters.ParamByName('ticketcost').Value := ticketcost; 
     qryData.Parameters.ParamByName('openingact').Value := openingact; 
     qryData.Parameters.ParamByName('amountbooked').Value := amountbooked; 
     qryData.ExecSQL; 
     qryData.SQL.Clear; 
     qryData.SQL.Add('SELECT * FROM eventinfo'); 
     qryData.Last; 
     qryData.Open; 
+0

无法对封闭数据集执行此操作通常会指向您要对封闭数据集执行的操作。 'qryData.Last; qryData.Open;'看起来很可疑。 – nil

+0

如果你想要做的是获取EventNum的最高现有值并为其添加1,那么这是一个非常低效且容易出错的方式。你在使用哪个后端服务器? – MartynA

+0

是的,执行此操作的典型方法是使用自动增量索引字段。 –

回答

2

你的错误:

qryData.ExecSQL; 
qryData.SQL.Clear; 
qryData.SQL.Add('SELECT * FROM eventinfo'); 
qryData.Last; { !! should be after ---v } 
qryData.Open; { should be first ---^ } 

调用.ExecSQL执行非查询(即:没有返回记录)命令。由于这里没有有效的数据集,因此调用.Last会引发错误。您必须先致电.Open

with dmQuery_u.dmInfo do 
    {...} 
    qryData.Parameters.ParamByName('bandname').Value := name; 

这里with语句隐藏你想的name变量:

为了您namedmInfo填充的第二个问题,你被利用的危险with声明这里的抓了出来使用并将其解释为dmQuery_u.dmInfo.Name。要么摆脱with声明并对所有内容使用显式修饰符或更改name变量的名称。

+0

因此,建议我应该更改我的代码,以便它不使用'with'语句? –

+0

@PhilipEllis或者改变或者改变'name'变量的名字。 “附带”声明的主题是一些强烈的意见。它有一些有效的用例,但通常当'with'块开始变大时,像这样的范围错误的概率就会增加。 –

相关问题