Delphi 7到XE8分配二进制ADO参数值
我正在将驻留在DLL中的报表转换为XE8,以便更新报表控件,这在Windows 10中是有问题的。为此,我不得不用内置的ADO控件替换ADO数据访问控件 问题是我们的数据使用二进制键,我遇到了为查询参数赋值的问题。在我们的代码中,键作为字符串传递,并分配给参数,并在运行时由控件转换 以前,利用旧控件,它使用Delphi DB单元,其中包含分配中使用的方法Delphi 7到XE8分配二进制ADO参数值,delphi,Delphi,我正在将驻留在DLL中的报表转换为XE8,以便更新报表控件,这在Windows 10中是有问题的。为此,我不得不用内置的ADO控件替换ADO数据访问控件 问题是我们的数据使用二进制键,我遇到了为查询参数赋值的问题。在我们的代码中,键作为字符串传递,并分配给参数,并在运行时由控件转换 以前,利用旧控件,它使用Delphi DB单元,其中包含分配中使用的方法.AsBlob。见下文 Qry.Close; Qry.ParamByName('@Id').AsBlob := IdStringValue; Q
.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
toTBlobData=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我将字符串转换为十六进制,并将其与数据中的字段进行比较。这些值确实匹配,但存储过程上的参数不匹配仍然是一个问题。谢谢你的帮助,我还在努力找出问题所在。