【问题标题】:AsStreams FireDAC got nil value from MemoryStreamAsStreams FireDAC 从 MemoryStream 获得 nil 值
【发布时间】:2021-07-09 02:32:54
【问题描述】:

我试图在我的数据库Access 中插入大量信息,但我被这个例子困住了:

(TableContact.FieldByName('foto') as TBlobField).SaveToStream(AQuery.Params.ParamByName('pFoto').AsStreams[I];

我的AsStreams[I] 总是为零

为了解决这个问题,我尝试执行一个循环,将我的 Streams 添加到一个数组中,然后将它们插入我的 AsStreams[I],但这是同样的错误 (nil)。

示例:

for I := 0 to Streams.Count - 1 do                                        
  (AQuery.Params.ParamByName('pFoto').AsStreams[I] as TBlobField).LoadFromStream(Streams[I]);

谁能帮帮我?

Full code downhere

procedure TPrincipalController.SetDadosMemTableToBanco;
var
I: Integer;
AQuery: TFDQuery;

  function GetSQLMemTableToBanco: String;
  begin
    Result :=
      'INSERT INTO PESSOA (nome, telefone, email, foto, observacoes) ' + sLineBreak +
      '     VALUES (:pNome, :pTelefone, :pEmail, :pFoto, :pObservacoes); ';
  end;

  function GetSQLMemTableUpdateToBanco: String;
  begin
    Result :=
      'UPDATE PESSOA ' + sLineBreak +
      '   SET nome = :pNome, ' + sLineBreak +
      '       telefone = :pTelefone, ' + sLineBreak +
      '       email = :pEmail, ' + sLineBreak +
      '       foto = :pFoto, ' + sLineBreak +
      '       observacoes = :pObservacoes ' + sLineBreak +
      ' WHERE id = :pID; ';
  end;

  procedure SetArraySizeOnSQLChange;
  begin
    AQuery.Params.ArraySize := FTableContatos.RecordCount;
  end;

begin
  try
    AQuery := TFDQuery.Create(nil);
    try
      AQuery.Connection := TConexao.GetConexao;

      TableContatos.First;
      for I := 0 to TableContatos.RecordCount - 1 do
      begin
        AQuery.SQL.Text := GetSQLMemTableToBanco;
        SetArraySizeOnSQLChange;

        if ExisteRegistro(TableContatos.FieldByName('id').AsInteger) then
        begin
          AQuery.SQL.Text := GetSQLMemTableUpdateToBanco;
          SetArraySizeOnSQLChange;
          AQuery.ParamByName('pID').AsIntegers[I] := TableContatos.FieldByName('id').AsInteger;
        end;

        AQuery.ParamByName('pNome').AsStrings[I] := TableContatos.FieldByName('nome').AsString;
        AQuery.ParamByName('pTelefone').AsStrings[I] := TableContatos.FieldByName('telefone').AsString;
        AQuery.ParamByName('pEmail').AsStrings[I] := TableContatos.FieldByName('email').AsString;
        AQuery.ParamByName('pObservacoes').AsStrings[I] := TableContatos.FieldByName('observacoes').AsString;

        (TableContatos.FieldByName('foto') as TBlobField).SaveToStream(AQuery.Params.ParamByName('pFoto').AsStreams[I]);

        TableContatos.Next;
      end;

      AQuery.Execute(TableContatos.RecordCount, 0);
    finally
     AQuery.Free;
    end;
  except
    on E: Exception do
      ShowMessageFmt('Erro ao incluir dados no banco. MSG -> %s', [E.Message]);
  end;
end;

【问题讨论】:

  • 你命名的完整代码不是minimal, complete, verifiable and reproducible example。请提供一个我们可以轻松玩的游戏。并在某个地方提供下载一个最小的实际 Access 数据库,您的示例将使用该数据库来显示问题。
  • 我明白了。 1º 错误:我无法在执行时使用更新和插入 SQL; 2º 错误:AsStreams[I] 上的归属。为了解决它,我必须使用 Stream 对象来保存图像,如下所示: AStream := TableContatos.CreateBlobStream(TableContatos.FieldByName('foto'), TBlobStreamMode.bmRead);尝试 AQuery.ParamByName('pFoto').LoadFromStream(AStream, ftBlob, I);最后是AStream.Free;结束;

标签: arrays delphi insert blob memorystream


【解决方案1】:

仅使用 SQL 上的更新和我需要使用的字段的属性来解决,如下所示:

AStream := TableContatos.CreateBlobStream(TableContatos.FieldByName('foto'), TBlobStreamMode.bmRead);
    try
      AQuery.ParamByName('pFoto').LoadFromStream(AStream, ftBlob, I);
    finally
      AStream.Free;
    end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多