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