Delphi 将TMemoryStream转换为variant

Delphi 将TMemoryStream转换为variant,delphi,memorystream,variant,Delphi,Memorystream,Variant,如何将TMemoryStream的内容转换为变体?我使用Delphi2010 TMemoryStream存储文件的内容,可以是PDF或JPG(扫描文档) 文件保存在MS SQL base中。 当我在程序中进入编辑模式时,我会将该文件的内容从base提取到TMemoryStream中 编辑完文档的卡片后,我需要将文档发回基地。 扫描的文件也可以更改(或替换为其他文件)。 为了回发记录,我使用了一个带有一组参数的存储过程——每个字段一个参数。 我将参数作为变量传递给存储过程 这就是为什么我需要将TM

如何将TMemoryStream的内容转换为变体?我使用Delphi2010

TMemoryStream存储文件的内容,可以是PDF或JPG(扫描文档)

文件保存在MS SQL base中。 当我在程序中进入编辑模式时,我会将该文件的内容从base提取到TMemoryStream中

编辑完文档的卡片后,我需要将文档发回基地。 扫描的文件也可以更改(或替换为其他文件)。 为了回发记录,我使用了一个带有一组参数的存储过程——每个字段一个参数。 我将参数作为变量传递给存储过程


这就是为什么我需要将TMemoryStream转换为一个变量。

假设您需要该变量来保存一个字节数组,您可以使用以下方法:

var
  MS: TMemoryStream;
  V: Variant;
  P: Pointer;
begin
  ...
  V := VarArrayCreate([0, MS.Size-1], varByte);
  if MS.Size > 0 then
  begin
    P := VarArrayLock(V);
    Move(MS.Memory^, P^, MS.Size);
    VarArrayUnlock(V);
  end;
  ...
end;

TMemoryStream
没有直接访问内部数据的便捷方法。它提供了一个属性,该属性为您提供指针,但不提供任何有用的数据类型。但是,如果使用从
TMemoryStream
派生的
tbytestream
,则可以将数据作为
TBytes
类型的变量从流中获取

在此之后,假设您的参数是
TParam
类型的标准参数对象,则不需要使用变量。您可以这样做:

param.AsBlob := MyTBytesVariable;
或者,更简单的是,您可以直接使用流:

param.AsStream := MyMemoryStream;

(如果这样做,请确保首先将流的
位置设置为0)。

如果
MS.size=0
并将-1作为第二维度传递给
VarArrayCreate
,会发生什么情况?这不是问题,因为如果MS.size>0
,我们可以将
放在第一位。将上限设置为-1是有效的。这就是创建空数组的方式。数组中的元素数计算为
上限-下限+1
,因此
-1-0+1
0
。为什么要使用
变量
将数据传递给DB?这不是很有效。假设已将存储过程包装在自定义函数中,则应为每个参数使用实际数据类型,或至少使用常量的
数组,以便保留类型信息。对于blob字段,您可以使用
TStream
通过
TDataSet.CreateBlobStream()
TParam.AsStream
发布该数据。您希望使用什么格式将其存储在变量中。记住,变体只是一个容器。雷米,谢谢你的两篇文章。我当然应该将我的变体转换回实际的数据类型。事实上,我现在不记得为什么我开始把我的数据当作变量,所以现在我没有理由不把它们恢复原状。再次感谢。
TMemoryStream
没有返回
TBytes
的属性。您想到的是
tbytestream
,它源自
TMemoryStream