delphi android 闪退

daigua1987 2023-03-17 18:51:38

Delphi android 如果是使用一般的select语句 没有闪退,后面有些复杂的语句需要存储过程来处理 就会碰到闪退的问题

unit DatePostThread;

interface

uses System.SysUtils, System.Types, System.UITypes, System.Classes, IdHTTP,
  IdComponent, Math, FMX.Forms,
  FMX.Helpers.Android, Androidapi.JNI.Support, Androidapi.Helpers,
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.Net,
  Androidapi.JNI.JavaTypes, Androidapi.JNI.Os, Datasnap.DBClient,
  IOUtils, System.Permissions, UpdateApp, FMX.Types, FMX.Dialogs, FMX.StdCtrls;

type
  TDatePostThread = Class(TThread)
  protected
    procedure Execute; override;

  public
    constructor Create(sql: String; FrameName: String; code: String;
      Sender: TObject);
    destructor Destroy(); override;

  var
    EexSql: String;
    Frame: String;
    Timecode: String;
    From: TObject;
  End;

implementation

uses uPubFUNCs, Main, Server, OrderOut;

constructor TDatePostThread.Create(sql: String; FrameName: String; code: String;
  Sender: TObject);
begin
  EexSql := sql;
  Frame := FrameName;
  Inherited Create(False);
  // FreeOnterminate := True;
end;

destructor TDatePostThread.Destroy();
begin
  Inherited Destroy;
end;

procedure TDatePostThread.Execute;
var
  ClientDataSet: TClientDataSet;
begin
  ClientDataSet := TClientDataSet.Create(TForm(From));
  try
    FMain.SQLConnection1.Open;
    FMain.SQLConnection1.Connected := True;
    ClientDataSet.ProviderName := 'DataSetProvider1';
    ClientDataSet.RemoteServer := FMain.DSProviderConnection1;
  EXCEPT
    FMain.FDQuery1.Close;
    FMain.FDQuery1.sql.Clear;
    FMain.FDQuery1.sql.Add
      ('insert into DataPost(ModeName,ID,SqlStr) values(:ModeName,:ID,:SqlStr)');
    FMain.FDQuery1.ParamByName('ModeName').Value := Frame;
    FMain.FDQuery1.ParamByName('ID').Value := Timecode;
    FMain.FDQuery1.ParamByName('SqlStr').Value := EexSql;
    FMain.FDQuery1.ExecSQL;
    exit;
  end;

  TServerMethods1Client.Create(FMain.SQLConnection1.DBXConnection)
    .SqlExecLog(EexSql, FMain.Login);
  ClientDataSet.Close;
  ClientDataSet.CommandText := EexSql;
  ClientDataSet.Open;

end;

end.

这是执行代码

 SQL := 'exec spOrderOutDataPost ''' + PrintCodeList + ''',''' + AutoIDList +
    ''',''' + cInvCodeList + ''',''' + cBatchList + ''',''' + OutQtyList +
    ''',''' + Edit4.Text + ''',''' + Ptype + ''',''' +
    Copy(WH, 1, pos('/', WH) - 1) + ''',''' + Copy(WH, pos('/', WH) + 1,
    length(WH)) + ''',''' + Timecode + ''',''' + FMain.Login + ''',''' +
    FMain.Password + ''',''' + FMain.LoginDate + '''';

  DatePostThread := TDatePostThread.Create(SQL, '销售出库', Timecode, self);

这是调用代码

为什么执行存储过程 就可能出现闪退 ?

这是中间层的控件

 

...全文
211 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

存储过程是能够返回数据的,所以如果在SQL中执行存储过程,不要用ExecSQL,要用Open。

  • 打赏
  • 举报
回复

估计是你的存储过程返回了某些错误代码触发了异常,而你没有捕捉,而你的SQL连接是运行在主线程中的,线程中出现未捕捉的异常默认处理模型就是终止线程,主线程终止,你的程序就退出了。所以,程序的健壮性很重要~

daigua1987 2023-03-20
  • 举报
回复
@日立奔腾浪潮微软松下联想 我后端测试了 执行的代码 存储过程没有报任何异常 没办法 我就把执行代码放到了服务端执行 问题就没了
tanqth 2023-03-19
  • 打赏
  • 举报
回复

这个应该与SQL语句没什么关系吧。

daigua1987 2023-03-20
  • 举报
回复
@tanqth 测试了 执行存储过程 就容易闪退 后面我把执行都放到了服务端 问题就解决了 也不知道是什么情况
tanqth 2023-03-21
  • 举报
回复
@daigua1987 可能的原因是你存储过程返回的数据内容引发安卓端闪退。通常不建议把SQL放在客户端处理,放在服务端处理是更好的选择。包括安全、稳定、更新系统等,都有好处的。

5,715

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧