【发布时间】: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