【问题标题】:Delphi: Cannot perform this operation on a closed dataset (XE6)Delphi:无法在封闭的数据集上执行此操作(XE6)
【发布时间】:2014-09-21 20:02:25
【问题描述】:

我有一小段代码,输入时从数据库中获取对应的值,也就是像这样的数据库中

Code     Name

 1        A

 2        B

 3        C

代码区输入1,返回A,名称区输入B,返回2。

我可以使用以下代码使其正常工作,但会弹出一条错误消息,显示“无法在已关闭的数据集上执行此操作”

有谁知道如何解决这个问题?任何帮助,将不胜感激。谢谢

procedure TStock_Bookkeeping.Stock_Code_ValueChange(Sender: TObject);
begin
  Price_Per_Share_Value.Text := GetCurrentPrice(Stock_Code_Value.text);
  ExecuteSQL_CodeToName(Stock_Code_Value.Text);
end;

procedure TStock_Bookkeeping.Stock_Name_ValueChange(Sender: TObject);
begin
  ExecuteSQL_NametoCode(Stock_Name_Value.Text);
end;

procedure TStock_Bookkeeping.ExecuteSQL_CodeToName(const inCode: string);
var
  query : TFDQuery;
begin
  query := TFDQuery.Create(nil);
  try
    ConnectToSQLite;
    query.Connection := FDConnection1;
    query.SQL.Text := 'SELECT * FROM Code_Name where Code =' + '"' + inCode + '"' ;
    query.Active := True;
    query.Open();

    while not query.Eof do
    begin
      Stock_Name_Value.text := query.FieldByName('Name').AsString;
      query.Next;
    end;
  finally
    query.Close;
    query.DisposeOf;
  end;
end;

procedure TStock_Bookkeeping.ExecuteSQL_NameToCode(const inName: string);
var
  query : TFDQuery;
  memTable : TFDMemtable;
begin
  query := TFDQuery.Create(nil);
  try
    ConnectToSQLite;
    query.Connection := FDConnection1;
    query.SQL.Text := 'SELECT * FROM Code_Name where Name ='+'"'+ inName+'"';
    query.Active := True;
    query.Open();

    while not query.Eof do
    begin
      Stock_Code_Value.text := query.FieldByName('Code').AsString;
      query.Next;
    end;

  finally
    query.Close;
    query.DisposeOf;
  end;
end;

【问题讨论】:

  • 我们无法从这里看到您的屏幕 - 您在哪一行确切收到错误消息?
  • 我在编译时没有任何错误,实际上我在运行时得到了结果,除了弹出“无法在关闭的数据集上执行此操作”消息...感谢您的回复: )
  • 我不会设置Active 属性。我只需分配一个连接、SQL 查询并调用Open。此外,无需在 finally 块中调用 Close。如果引发异常(并且数据集不会打开),您将关闭已关闭的数据集。此外,花时间学习如何使用参数。您的代码现在容易受到 SQL 注入攻击。
  • 请确保您编辑您的 q 以回答 Copilot 的评论。此外,我没有遵循您在“while not query.eof”循环中尝试执行的操作 - 您似乎正在通过 each 行的字段值覆盖 Stock_Name_Value 和 Stock_Code_Value 的 .text 属性,而不仅仅是其中之一。
  • 你为什么同时使用Active := True(打开查询)和Open;(尝试再次打开已经打开的查询)?

标签: sql database delphi dataset syntax-error


【解决方案1】:

设置断点并遍历代码(F7):

如果Stock_Code_ValueChange 事件在您更改Stock_Code_Value.Text 的值时连接到Stock_Code_Value 编辑框,则您正在更改Stock_Name_Value.Text 的值,然后触发Stock_Name_ValueChange 事件但您尚未完成Stock_Code_ValueChange 事件。

添加Stock_Name_ValueOnChange := nil 作为Stock_Code_ValueChange 过程的第一行和Stock_Name_ValueOnChange := Stock_Name_ValueChange 作为过程的最后一行,以在Stock_Code_ValueChange 事件正在处理时停止触发Stock_Name_ValueChange 事件。

然后对 Stock_Name_ValueChange 事件执行相反的操作。

【讨论】:

  • 完全错过了独立的查询对象 :-o 但你可能仍然想要做出我建议的更改。
  • 感谢您的建议,但在我试用后,我收到“实际参数不足”的错误消息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 1970-01-01
  • 2012-12-20
相关资源
最近更新 更多