我正在将一个驻留在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
之前尝试将String
从AnsiString
投射到StringToVarArray
,但这没有任何区别。
任何人都知道如何处理这个问题?谢谢。
答案 0 :(得分:0)
在分配参数时将字符串值转换为字节数组。
Qry.Parameters.ParamByName('@Id').AsBlob := TEncoding.Default.GetBytes(StringValue);