Delphi-用ZLib压缩TStringList并保存到SQL VARBINARY列



我需要从TStringList中获取值,使用System.ZLIb库对其进行压缩,并将其作为VARBINARY(MAX(列保存到SQL Server数据库中。

到目前为止,我已经能够从SQL表中读取压缩的数据,解压缩它,并将它加载到TStringList中。然而,将数据保存回数据库是我的问题所在,我无法使其工作。根据Embarcadero docwiki,这应该是一个非常简单的过程:http://docwiki.embarcadero.com/CodeExamples/Sydney/en/ZLibCompressDecompress_(德尔福(

这是更新SQL表的代码。当我到达";CompressedStrm.CopyFrom(InputStream,InputStream.Size("行,我得到一个";流读取错误";错误

procedure TdmMain.SaveSystemSetting(SettingName: string; Settings: TStringList);
var
InputStream, OutputStream: TMemoryStream;
CompressedStrm: TCompressionStream;
begin
InputStream:= TMemoryStream.Create;
OutputStream:= TMemoryStream.Create;
try
Settings.SaveToStream(InputStream, TEncoding.Default);
CompressedStrm := TCompressionStream.Create(clDefault, OutputStream);
try
CompressedStrm.CopyFrom(InputStream, InputStream.Size);
OutputStream.SaveToFile('c:output.zip');
finally
FreeAndNil(CompressedStrm);
end;
{save settings to the database}
qryWork.Close;
qryWork.SQL.Clear;
qryWork.SQL.Add('UPDATE SystemSettings');
qryWork.SQL.Add('   SET Setting = :data');
qryWork.SQL.Add(' WHERE SettingName = ''' + SettingName + '''');
qryWork.Parameters.ParamByName('data').LoadFromStream(OutputStream, ftBlob);
qryWork.ExecSQL;
finally
FreeAndNil(InputStream);
FreeAndNil(OutputStream);
end;
end;

下面的代码从数据库中读取,解压缩数据并加载TStringList-它可以100%工作:

procedure TdmMain.GetSystemSetting(SettingName: string; var Settings: TStringList);
var
SettingBlob: TBlobField;
DecompStream: TDecompressionStream;
InputStream, OutputStream: TMemoryStream;
begin
qryWork.Close;
qryWork.SQL.Clear;
qryWork.SQL.Add('SELECT Setting');
qryWork.SQL.Add('  FROM SystemSettings');
qryWork.SQL.Add(' WHERE SettingName = ''' + SettingName + '''');
qryWork.Open;
if not qryWork.EOF then
begin
SettingBlob := qryWork.FieldByName('Setting') as TBlobField;
InputStream := TMemoryStream.Create;
OutputStream := TMemoryStream.Create;
try
SettingBlob.SaveToStream(InputStream);
InputStream.Position := 0;
DecompStream := TDecompressionStream.Create(InputStream);
try
OutputStream.CopyFrom(DecompStream, 0);
OutputStream.Position := 0;
Settings.LoadFromStream(OutputStream, TEncoding.Default);
finally
FreeAndNil(DecompStream);
end;
finally
FreeAndNil(InputStream);
FreeAndNil(OutputStream);
end;
end;
qryWork.Close;
end;

忘记重新定位输入流。。。

try
Settings.SaveToStream(InputStream, TEncoding.Default);
InputStream.Position := 0;
...

最新更新