解决Delphi 10.4中ClientDataSet执行存储过程,传递的参数出现无法识别的空格的问题

欢迎加入全网最大Delphi 技术交流群 682628230

在使用Delphi 10.4开发Android程序时,通过TSQLConnection(DataSnap)和TClientDataSet连接数据库并调用存储过程时,遇到传递的参数后面出现无法识别的空格的问题。这个问题的根本原因在于参数的大小设置导致了固定长度字符串的填充现象。

解决方案:

通过引入一个TADOConnection和TADOStoredProc在服务器端构建,并从FMX客户端调用服务器的方法来绕过直接使用TClientDataSet带来的参数处理问题。这样做的好处是可以避免因参数大小设置不当导致的额外空格问题。

具体实现步骤如下:
  1. 服务器端配置:

    • 添加TADOConnection和TADOStoredProc组件。
    • 配置TADOStoredProc以指向你的存储过程S_SignSR
  2. 客户端调用:

    try
        SQLServerMethod := TSQLServerMethod.Create(nil);
        try
            SQLServerMethod.SQLConnection := SQLConnection1; // 假设这是你的TSQLConnection
            SQLServerMethod.ServerMethodName := 'THHSVMethods.s_sign'; // 替换为你的方法名称
            SQLServerMethod.Params[0].Value := orderNo;
            SQLServerMethod.Params[1].Value := date;
            SQLServerMethod.ExecuteMethod;
            orderNo := SQLServerMethod.Params[0].Value;
            date := SQLServerMethod.Params[1].Value;
        finally
            SQLServerMethod.Free;
        end;
    except
        on E: Exception do
          ShowMessage('Error: ' + E.Message);
    end;
    这种方法的好处是,在SQL Server上执行的语句不再有不必要的空格,解决了数据转换错误的问题。
    
    尽管同时使用TSQLConnection和TADOConnection可能看起来有些奇怪,但在当前情况下,这是一种有效的解决方案,特别是在尝试了多种调整参数大小和类型的方式均未成功之后。
    
    注意: 在传递日期时间值给数据库时,推荐使用ftDateTime类型而非字符串类型,这可以避免由于格式不匹配导致的转换错误。如果必须使用字符串格式,请确保日期时间格式符合SQL Server的预期格式(例如:yyyy-mm-ddTHH:mm:ss),以减少潜在的转换问题。然而,在上述案例中,通过改变调用方式从根本上解决了参数附加空格的问题。

     

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享