0

为了重现这个问题,让我们有以下两个超级简单的 SP,第一个没有任何参数,第二个只有一个输出参数:

1. testsp_0_nopar:
CREATE DEFINER=`root`@`%` PROCEDURE `testsp_0_nopar`()
BEGIN
    #do nothing
END

2. testsp_1_outpar:
CREATE DEFINER=`root`@`%` PROCEDURE `testsp_1_outpar`(OUT result INT)
BEGIN
    SET result=100;
END

如果我们调用第一个 SP 两次,一个接一个,那么它可以正常工作:

var
  sp: TFDStoredProc;
begin
  try
    con.ResourceOptions.AutoReconnect := false; // <- this is important in our project
    con.Connected := True;
    sp := TFDStoredProc.Create(nil);
    try
      sp.Connection := con;
      sp.StoredProcName := 'mydatabase.testsp_0_nopar';
      sp.ExecProc;
      sp.Close;
      sp.ExecProc;
    finally
      sp.Free;
    end;
  except
    on e: exception do
    begin
      ShowMessage(e.Message);
    end;
  end;

但是如果我们调用第二个 SP 两次,一个接一个,然后我们得到一个异常:

var
  sp: TFDStoredProc;
begin
  try
    con.ResourceOptions.AutoReconnect := false; // this is important in our project
    con.Connected := True;
    sp := TFDStoredProc.Create(nil);
    try
      sp.Connection := con;
      sp.StoredProcName := 'mydatabase.testsp_1_outpar';
      sp.Params.Add('result', ftInteger, 1, ptOutput);
      sp.ExecProc;
      sp.Close;
      sp.ExecProc; // <- this second sp call raises an exception
    finally
      sp.Free;
    end;
  except
    on e: exception do
    begin
      ShowMessage(e.Message); // <- Lost connection to MySQL server during query
    end;
  end;

在现实生活场景中,我们不得不在我们的项目中频繁调用同一个SP,不同的参数值,所以每次都free-then-recreate SP对象并不是一个好的解决方案。

这在使用 AnyDac 的旧 Delphi 版本中运行良好,但使用 FireDac 时我们遇到了这个问题。

非常感谢您的帮助!:)

4

1 回答 1

-1

看起来有人也遇到了这个问题,并将解决方案发布到 Embarcadero 的质量中心: https ://quality.embarcadero.com/browse/RSP-31692

所以这是一个 FireDac 错误,要修复它,您必须按照上述链接指示的方式编辑 FireDac 的源代码。我可以确认它可以解决问题。

于 2020-11-30T11:03:14.947 回答