TClientDataSet的Params的奇怪现象(100分)

G

guojun

Unregistered / Unconfirmed
GUEST, unregistred user!
TClientDataSet-->TDataSetProvider-->TADOQuery
ADOQuery.SQL.Text := 'select * from aTable where key=:mykey'
ClientDataSet.params[0].Value := '我想要找的内容'
查不出数据,从Profiler看到,SQLserver把 '我想要找的内容' 定义成 char(7)
实际上是char(14)才对,看来是解释成widestring了。
是Delphi有问题,还是ADO有问题?还是我用法不对?
 
VCL Source: ADODB.pas
function VarDataSize(const Value: OleVariant): Integer;
begin
if VarIsNull(Value) then
Result := -1
else
if VarIsArray(Value) then
Result := VarArrayHighBound(Value, 1) + 1
else
if TVarData(Value).VType = varOleStr then
begin
[red] //Result := Length(PWideString(@TVarData(Value).VOleStr)^);
Result := Length(String(Value));[/red]
if Result = 0 then
Result := -1;
end
else
Result := SizeOf(OleVariant);
end;
 
改源码啊?!
//Result := Length(PWideString(@TVarData(Value).VOleStr)^);
borland这样写一定
是有他的道理,如果不改他的源码,我们在传参时有办法处理吗?
另外,这个问题只出现在汉字上,对英文没错误。
 
这个问题很麻烦,暂时这样吧,在传参时在参数字符串后加空格
for i:=0 to length(widestring(Trim(Edit1.Text)))-1do
ClientDataSet.Params.ParamByName('XXX').AsString:=ClientDataSet.Params.ParamByName('XXX').AsString+' ';
 
如果改ADODB.pas,我需要重新生成Vclado50.bpl,可是,这个包有哪些文件啊。
Vclado50.dpk要加哪几个文件?
 
多人接受答案了。
 
function ToCDSParamsString(s:string):string;
var
ws:WideString;
i:Integer;
begin
ws:=s;
for i:=1 to Length(ws)do
begin
if Ord(ws)>255 then
s:=s+' ';
end;
Result:=s;
end;

ClientDataset.Params[0].value:=ToCDSParamsString(AString);
先用着吧
 
顶部