Сброс переменной PChar - PullRequest
3 голосов
/ 22 марта 2010

Я не знаю много о программировании на Delphi Win 32, но я надеюсь, что кто-нибудь ответит на мой вопрос.

Я получаю дубликат l_sGetUniqueIdBuffer, сохраненный в базе данных, которого я хочу избежать.

l_sGetUniqueIdBuffer фактически отличается (значение l_sAuthorisationContent равно xml, и я вижу другое значение, сгенерированное вызовом getUniqueId) между строками.Эта проблема является неустойчивой (дубликаты встречаются редко ...) Разница в дате обновления между строками составляет только миллисекунды.

Дано:

(исключен бессмысленный код)

var
    l_sGetUniqueIdBuffer: PChar;
    FOutputBufferSize : integer;

begin
    FOutputBufferSize := 1024;
    ...
    while( not   dmAccomClaim.ADOQuClaimIdentification.Eof ) do
    begin

        // Get a unique id for the request
        l_sGetUniqueIdBuffer := AllocMem (FOutputBufferSize);

        l_returnCode := getUniqueId (m_APISessionId^, l_sGetUniqueIdBuffer, FOutputBufferSize);

        dmAccomClaim.ADOQuAddContent.Active := False;
        dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pContent').Value := (WideString(l_sAuthorisationContent));
        dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pClaimId').Value := dmAccomClaim.ADOQuClaimIdentification.FieldByName('SB_CLAIM_ID').AsString;
        dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pUniqueId').Value := string(l_sGetUniqueIdBuffer);
        dmAccomClaim.ADOQuAddContent.ExecSQL;

        FreeMem( l_sAuthorisationContent, l_iAuthoriseContentSize );

        FreeMem( l_sGetUniqueIdBuffer, FOutputBufferSize );
    end;
end;

Полагаю, мне нужно знать, сбрасывается ли значение в l_sGetUniqueIdBuffer для каждой строки ??

1 Ответ

0 голосов
/ 22 марта 2010

AllocMem реализован следующим образом

function AllocMem(Size: Cardinal): Pointer;
begin
  GetMem(Result, Size);
  FillChar(Result^, Size, 0);
end;

так что да, значение, на которое указывает l_sGetUniqueBuffer, всегда будет сброшено в пустую строку.

1010 * Debugging *

var
    l_sGetUniqueIdBuffer: PChar;
    FOutputBufferSize : integer;
    list: TStringList;
begin
    FOutputBufferSize := 1024;
    ...

    list := TStringList.Create;
    try
      list.Sorted := True;
      while( not   dmAccomClaim.ADOQuClaimIdentification.Eof ) do
      begin

          // Get a unique id for the request
          l_sGetUniqueIdBuffer := AllocMem (FOutputBufferSize);

          l_returnCode := getUniqueId (m_APISessionId^, l_sGetUniqueIdBuffer, FOutputBufferSize);

          dmAccomClaim.ADOQuAddContent.Active := False;
          dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pContent').Value := (WideString(l_sAuthorisationContent));
          dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pClaimId').Value := dmAccomClaim.ADOQuClaimIdentification.FieldByName('SB_CLAIM_ID').AsString;
          dmAccomClaim.ADOQuAddContent.Parameters.ParamByName('pUniqueId').Value := string(l_sGetUniqueIdBuffer);

          if list.IndexOf(l_sGetUniqueIdBuffer) <> - 1 then
            write; //***** Place a breakpoint here.
          list.Add(l_sGetUniqueIdBuffer);

          dmAccomClaim.ADOQuAddContent.ExecSQL;

          FreeMem( l_sAuthorisationContent, l_iAuthoriseContentSize );

          FreeMem( l_sGetUniqueIdBuffer, FOutputBufferSize );
      end;
    finally
      list.Free;
    end;
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...