Delphi 将变量字节数组保存到参数化查询
在包含blob字段的ClientDataSet的TDataSetProvider.OnBeforeUpdate事件处理程序中,我想分配Delphi 将变量字节数组保存到参数化查询,delphi,datasnap,Delphi,Datasnap,在包含blob字段的ClientDataSet的TDataSetProvider.OnBeforeUpdate事件处理程序中,我想分配DeltaDS.Fields[I]的值.NewValue在本例中,它当然是blobField值的一个变量字节数组-用于查询。Update语句的参数,例如updatemytable set myBlob=:myBlob,其中id=:id 很明显我把事情搞得一团糟 做这件事的优雅方式是什么?谢谢 i := 0; while (i < DeltaD
DeltaDS.Fields[I]的值.NewValue
在本例中,它当然是blobField值的一个变量字节数组-用于查询。Update
语句的参数,例如updatemytable set myBlob=:myBlob,其中id=:id
很明显我把事情搞得一团糟
做这件事的优雅方式是什么?谢谢
i := 0;
while (i < DeltaDS.Fields.Count) do
begin
// not all the code, just the bit relevant to the question
if (DeltaDS.Fields[i].DataType = TFieldType.ftBlob) then
begin
// field value is an Array of Byte
// copy it first
ab := DeltaDS.Fields[i].NewValue; // no error here
if (Length(ab) * SizeOf(Char)) > 0 then
begin
Stream := TMemoryStream.Create;
try
// write array of byte to stream
Stream.WriteBuffer(ab[0], Length(ab) * SizeOf(Char));
Stream.Position := 0; // rewind
// load parameter from stream
QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).DataType := ftBlob;
QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).LoadFromStream(Stream);
finally
Stream.Free;
end;
end;
end;
Inc(i);
end;
i:=0;
而(i0,则
开始
Stream:=TMemoryStream.Create;
尝试
//将字节数组写入流
Stream.WriteBuffer(ab[0],长度(ab)*SizeOf(Char));
流位置:=0;//重绕
//从流加载参数
QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).数据类型:=ftBlob;
QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).LoadFromStream(Stream);
最后
免费;
结束;
结束;
结束;
公司(一);
结束;
ab是如何定义的?由于您正在处理字节,因此SizeOf(Char)
条目似乎可疑…ab:Byte数组
非常感谢您的帮助。@whosrdaddy我将*Sizeof(Char)
从两个地方删除了。看来我的问题解决了。Thanks@nolaspeaker可以考虑使用<代码> TByTeStase:<代码>流:= TByTestStudio(创建)(ab);或更好,使用TParam.SetBlobData()
方法:QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).SetBlobData(PByte(ab)^,Length(ab))
甚至TParam.AsBlob
属性:QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).AsBlob:=ab代码>不错。代码(当然没有*SizeOf(Char))是“好”代码吗?我问的原因似乎是做这项工作。ab是如何定义的?由于您正在处理字节,因此SizeOf(Char)
条目似乎可疑…ab:Byte数组
非常感谢您的帮助。@whosrdaddy我将*Sizeof(Char)
从两个地方删除了。看来我的问题解决了。Thanks@nolaspeaker可以考虑使用<代码> TByTeStase:<代码>流:= TByTestStudio(创建)(ab);或更好,使用TParam.SetBlobData()
方法:QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).SetBlobData(PByte(ab)^,Length(ab))
甚至TParam.AsBlob
属性:QryUpdate.Params.ParamByName(DeltaDS.Fields[i].FieldName).AsBlob:=ab代码>不错。代码(当然没有*SizeOf(Char))是“好”代码吗?我问的原因似乎是做这项工作。