Delphi 将变量字节数组保存到参数化查询

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

在包含blob字段的ClientDataSet的TDataSetProvider.OnBeforeUpdate事件处理程序中,我想分配
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))是“好”代码吗?我问的原因似乎是做这项工作。