专业服装进销存批发收银管理软件

当前位置: 主页 > 系统更新 > 内核更新 >

服务程序更新

时间:2018-09-12 02:59
18年9月12日 : 对服务程序内核进行以下更新: 1、接收数据包时,接收图片,文件,及其他非执行命令时,创建一个内存没有释放。 这段代码没有在TRY范围内。该功能执行完后要自己释
18年9月12日 :

对服务程序内核进行以下更新:


1、接收数据包时,接收图片,文件,及其他非执行命令时,创建一个内存没有释放。
这段代码没有在TRY范围内。该功能执行完后要自己释放。

  ms := TBytesStream.Create;
  if mc = 'fim' then // 多个文件上传
  begin
    SetLength(tee, 10);
    pvObject.ReadBuffer(PChar(tee)^, 10);
...................................


2、服务程序接受执行SQL脚本更新的文件:
系统不支持执行太长的文件,如修改存储过程。。。就必须要使用此功能。

  else if mc = 'sql' then // 上传上来的sql脚本文件,必须是UNICODE格式
  begin
    SetLength(tee, 10);
    pvObject.ReadBuffer(PChar(tee)^, 10);
    ms.SetSize(pvObject.Size - 13);
    pvObject.ReadBuffer(TBytesStream(ms).Memory^, pvObject.Size - 13);


3、连接池断开释放的功能停用。主要是多线程用户有可能在使用该连接,如果本线程去释放,
其他线程读CONNECTED 是否连接的属性时会直接报读地址错误。
而且CONNECTED的属性不能真正反应与MSSQL的连接是否有效,有时断开后该属性还是为TRUE,不可靠,
使用直接OPEN是否返回结果的方式来判断连接是否有效。

{ ****************************************************************
   释放EXE的连接,主要是在连接SQLSERVER断开时用
  **************************************************************** }
procedure TDmServer.FreeExecAdo;
var
  i: Integer;
begin
  try
    for i := Self.ComponentCount - 1 downto 0 do
    begin
      if (Self.Components[i] is TADOConnection) then
      begin
        if Self.Components[i] <> AdoConMain then
          TADOConnection(Self.Components[i]).Free;
      end;
    end;
  except
    // 不管是否创建,都要计数一次
  end;
end;

4、日记文件全部以HONIIC,Z,S  +年月日的格式。


5、错误出现在与数据连接断开,又重连时,点修改,如果连接一直错误,服务器就会出现无法跳出临界的锁定。

解决办法:
EXECSQL 过程,EnterCriticalSection(CLEXE) 进入临界时,必须要在测试网络是否通后才进行。
且要跳过 ‘T' 的参数。这样处理在连接无法完成时,返回错误信息,并跳出临界。

所有测试网络是否通的代码全转成以下片断。


      // --------先测试网络是否通--------
      i := 0;
      repeat
        try
          AdoQ.sql.Text := ' select 1 as D';
          AdoQ.open; // 如果出错,肯定是链接断开
          AdoQ.Close;
        except
          AdoQ.connection.Connected := False;
        end;
        i := i + 1;
      until (i = 2) or AdoQ.connection.Connected;


      if AdoQ.connection.Connected = False then
      begin
        Result := '数据库连接失败!';
        exit;
      end
      else
      begin
        if (g_net = 0) and (param <> 'T') then
          EnterCriticalSection(CLEXE);
      end;


6、
------分隔线----------------------------