【问题标题】:Delphi 7 to XE8 assigning binary ADO parameter valuesDelphi 7 到 XE8 分配二进制 ADO 参数值
【发布时间】: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 之前,我尝试将IdStringValueString 转换为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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2023-03-04
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多