不要用参数,sql可以这样写: var s: string; beging s := '抗震救灾,支援汶川'; adoquery.close; adoquery.sql.text := 'insert table1 (field1,field2) values (1,''' + s + ''')'; adoquery.execsql; end;
VarDataSize函数,下面是它的代码: 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 Result := Length(PWideString(@TVarData(Value).VOleStr)^); //出问题的行 if Result = 0 then Result := -1; end else Result := SizeOf(OleVariant); end; 就是在这个函数中计算实参的长度的,它把Value中的值取出地址,并把它作为一个WideString的指针去求字符串长度,结果就导致了“会截断的中文字”这个字符串的长度变成了7,而不是14。 问题找到了,解决起来也就不困难了,只要简单的把 Result := Length(PWideString(@TVarData(Value).VOleStr)^); //出问题的行 改成 Result := Length(PAnsiString(@TVarData(Value).VOleStr)^); //没问题了 就可以了。 但是这样就会导致求英文字符串的长度时长度被加倍了,所以也可以把这一行改成: Result := Length(Value);
datamodule1.ClientDataSet11.close;
datamodule1.clientdataset11.Params.parambyname('unm').asstring:='徐超';
datamodule1.clientdataset11.execute;在数据库中只存一个徐字,而超字则没有了。这是为什么?
var
s: string;
beging
s := '抗震救灾,支援汶川';
adoquery.close;
adoquery.sql.text := 'insert table1 (field1,field2) values (1,''' + s + ''')';
adoquery.execsql;
end;
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
Result := Length(PWideString(@TVarData(Value).VOleStr)^); //出问题的行
if Result = 0 then
Result := -1;
end
else
Result := SizeOf(OleVariant);
end; 就是在这个函数中计算实参的长度的,它把Value中的值取出地址,并把它作为一个WideString的指针去求字符串长度,结果就导致了“会截断的中文字”这个字符串的长度变成了7,而不是14。 问题找到了,解决起来也就不困难了,只要简单的把
Result := Length(PWideString(@TVarData(Value).VOleStr)^); //出问题的行
改成
Result := Length(PAnsiString(@TVarData(Value).VOleStr)^); //没问题了
就可以了。 但是这样就会导致求英文字符串的长度时长度被加倍了,所以也可以把这一行改成:
Result := Length(Value);
最好在服务端定义一个过程序,客户端调用远程过程.
datamodule1.clientdataset11.Params.parambyname('unm').asstring:='徐超';
//加上下面这行
datamodule1.clientdataset11.Params.parambyname('unm').size:=length('徐超');
datamodule1.clientdataset11.execute;在数据库中只存一个徐字,而超字则没有了。这是为什么?