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

Delphi 7到XE8分配二进制ADO参数值,delphi,Delphi,我正在将驻留在DLL中的报表转换为XE8,以便更新报表控件,这在Windows 10中是有问题的。为此,我不得不用内置的ADO控件替换ADO数据访问控件 问题是我们的数据使用二进制键,我遇到了为查询参数赋值的问题。在我们的代码中,键作为字符串传递,并分配给参数,并在运行时由控件转换 以前,利用旧控件,它使用Delphi DB单元,其中包含分配中使用的方法.AsBlob。见下文 Qry.Close; Qry.ParamByName('@Id').AsBlob := IdStringValue; Q

我正在将驻留在DLL中的报表转换为XE8,以便更新报表控件,这在Windows 10中是有问题的。为此,我不得不用内置的ADO控件替换ADO数据访问控件

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

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

Qry.Close;
Qry.ParamByName('@Id').AsBlob := IdStringValue;
Qry.Open;
Type TBlobData = string;
在控件的实现中,它负责设置属性,该属性调用
SetAsBlob
。见下文

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

部分问题是Data.DB已更改
TBlobData=string
to
TBlobData=TArray

我尝试过按照前面实现中使用的相同方法将这些值分配给查询参数,但没有效果

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
转换为
ansisting
,但没有任何区别


有人知道怎么处理这件事吗?谢谢。

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


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

因为
AsBlob
现在需要一个字节数组,这就是您应该给它的,例如:
Qry.Parameters.ParamByName('@Id')。AsBlob:=TEncoding.Default.GetBytes(IdStringValue)
或任何你想要的
TEncoding
use@RemyLebeau我似乎无法使用内置ADO控件调用
Qry.Parameters.ParamByName('@Id').AsBlob
.AsBlob
不作为
t参数
的值方法显示,而是作为
t参数
的值方法显示。我尝试直接设置参数,
.DataType:=ftVarBytes
.Value:=TEncoding.Default.GetBytes(IdStringValue)
但是在参数类型不匹配方面得到了相同的错误。请使用属性而不是
.AsBlob
,并且不要手动设置
。数据类型
,让参数自己解决。@RemyLebeau我给了你的建议一次机会,得到了类似的结果。我还从设计时控件中删除并读取了参数,以允许它确定和设置数据类型。我创建了一个测试项目,从另一个查询中提取一个值,并使用该值设置另一个查询的参数,但它也不起作用。@RemyLebeau我将字符串转换为十六进制,并将其与数据中的字段进行比较。这些值确实匹配,但存储过程上的参数不匹配仍然是一个问题。谢谢你的帮助,我还在努力找出问题所在。