【问题标题】:cannot perform this operation on a closed dataset and incorrect data entered into table无法对已关闭的数据集和输入到表中的错误数据执行此操作
【发布时间】:2017-08-10 13:34:14
【问题描述】:

我遇到了这个错误,我正在努力找出我做错了什么。没有意义的是结果仍然发布到数据库中,除了名称字段之外的所有字段都是正确的。由于某种原因,在名称字段中输入了“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;

【问题讨论】:

  • 无法对封闭数据集执行此操作通常会将您指向您尝试对封闭数据集执行的操作。 qryData.Last; qryData.Open; 看起来很可疑。
  • 如果您尝试获取 EventNum 的最高现有值并将其加 1 以作为新行,那么这是一种非常低效且容易出错的方法。您使用的是哪个后端服务器?
  • 是的,典型的做法是使用自动递增索引字段。
  • with 子句没用!立即删除它

标签: sql delphi delphi-2010


【解决方案1】:

您的错误是在这里引起的:

 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

对于使用dmInfo 填充的name 字段的第二个问题,您会被此处使用危险的with 语句发现:

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

这里with 语句隐藏了您要使用的name 变量,而是将其解释为dmQuery_u.dmInfo.Name。要么去掉 with 语句,对所有内容使用显式限定符,要么更改 name 变量的名称。

【讨论】:

  • 那么,是否建议我更改我的代码,使其不使用'with'语句?
  • @PhilipEllis 或者更改name 变量的名称。 with 声明的主题是一些强烈的意见。它有一些有效的用例,但通常当with 块开始变大时,诸如此类的范围错误的可能性往往会增加。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 2014-09-21
  • 2013-02-05
  • 2013-03-05
  • 1970-01-01
  • 2015-08-11
  • 2021-05-16
相关资源
最近更新 更多