【发布时间】:2018-06-13 20:56:11
【问题描述】:
我正在将驻留在 DLL 中的报表转换为 XE8,以便我可以更新我们的报表控件,这在 Windows 10 中存在问题。在此过程中,我不得不将我们的 ADO 数据访问控件替换为内置的- 在 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) 作为其唯一参数,因此一切看起来都是正确的。
在调用StringToVarArray 之前,我尝试将IdStringValue 从String 转换为AnsiString,但这没有任何区别。
有人知道如何处理这个问题吗?谢谢。
【问题讨论】:
-
既然
AsBlob现在想要一个字节数组,那就是你应该给它的,例如:Qry.Parameters.ParamByName('@Id').AsBlob := TEncoding.Default.GetBytes(IdStringValue);或者你想使用的任何TEncoding -
@RemyLebeau 我似乎无法使用内置 ADO 控件调用
Qry.Parameters.ParamByName('@Id').AsBlob....AsBlob没有显示为TParameter的值方法,但确实适用于TParam。我尝试直接设置参数,.DataType := ftVarBytes;和.Value := TEncoding.Default.GetBytes(IdStringValue);,但参数类型不匹配出现相同的错误。 -
使用
.Value属性代替.AsBlob,并且不要手动设置.DataType,让参数自己解决。 -
@RemyLebeau 我试了一下你的建议,结果相似。我还从设计时控件中删除并读取了参数,以允许它确定和设置数据类型。我整理了一个测试项目,从另一个查询中提取一个值并使用该值设置另一个查询的参数,但它也不起作用。
-
@RemyLebeau 我将字符串转换为十六进制并将其与数据中的字段进行比较。这些值确实匹配,但存储过程上的参数不匹配仍然是一个问题。感谢您的帮助,仍在尝试找出问题所在。
标签: delphi