Delphi 7到XE8分配二进制ADO参数值

时间:2018-06-13 20:56:11

标签: delphi

我正在将一个驻留在DLL中的报告转换为XE8,以便我可以更新我们的报告控件,这在Windows 10中是有问题的。在这样做时,我必须用内置的替换我们的ADO数据访问控件-in ADO控件。

问题是我们的数据使用二进制密钥,而且我遇到了为查询参数分配值的问题。在我们的代码中,键作为字符串传递,并分配给参数并在运行时由控件转换。

以前,利用旧控件,它使用了Delphi DB单元,其中包含在赋值中使用的方法.AsBlob。见下文......

Qry.Close;
Qry.ParamByName('@Id').AsBlob := IdStringValue;
Qry.Open;

在控件的实现中,它处理了设置属性,该属性调用SetAsBlob。见下文......

Type TBlobData = string;

...

procedure TQryParameter.SetAsBlob(const Value: TBlobData);
begin
  Self.DataType := ftVarBytes;
  Self.Value := StringToVarArray(Value);
end;

部分问题是Data.DB已将TBlobData = string;更改为TBlobData = TArray<Byte>;

我尝试按照上一个实现中使用的相同方法将这些值分配给查询参数,但它不起作用。

Qry.Close;
Qry.Parameters.ParamByName('@Id').DataType := ftVarBytes;
Qry.Parameters.ParamByName('@Id').Value := ADODB.StringToVarArray(IdStringValue);
Qry.Open;

由于参数不匹配,我得到一个相当通用的MSSQL错误,“应用程序使用错误类型的值进行当前操作。”

ADO查询参数定义为VarBytes,存储过程接受BINARY(6)作为其唯一参数,因此一切看起来都是正确的。

我在调用IdStringValue之前尝试将StringAnsiString投射到StringToVarArray,但这没有任何区别。

任何人都知道如何处理这个问题?谢谢。

1 个答案:

答案 0 :(得分:0)

在分配参数时将字符串值转换为字节数组。

Qry.Parameters.ParamByName('@Id').AsBlob := TEncoding.Default.GetBytes(StringValue);