关于非法字符问题(100分)

D

dmg

Unregistered / Unconfirmed
GUEST, unregistred user!
大家都知道,TQuery在执行时,为避免非法字符的出现产生异常,可以用带参数的方式
ParamByName来带替在SQL语句里直接写入,但我碰到一些情况,用这种带参数的方法还
是出错。有哪位大侠有更好的办法吗?我这是这样写的:
先假设有一个Query1已打开,我们从这个数据集里取数.
TmpQry.Close;
with TmpQry.SQL do
begin
Clear;
Add('INSERT INTO aa (a,b)');
Add('VALUES :)aa,:bb)');
end;
TmpQry.ParamByName('aa').AsString:=Query1.FieldBYyName('aaa').AsString;
TmpQry.ParamByName('bb').AsString:=Query1.FieldBYyName('bbb').AsString;
if not TmpQry.Prepared then TmpQry.Prepare;
TmpQry.ExecSQL;

这样写时老是出错,后来跟踪后发现是[Query1.FieldBYyName('aaa').AsString]的值
存在非法字符,请大家帮帮忙吧!
 
什么非法字符,判断一下跳过就行了
 
如何判断啊?非法字符的类型有很多种啊。
 
你应该把问题说得详细一些
 
这已够详细了啊,就是如何避免非法字符带来异常嘛
 
你不说清楚我们怎么知道你的非法字符的来源。
 
非法字符是另一个表中的,举例说吧,A表中有字段aa,这个aa里含有非法字符,
把aa的值写进B表中的bb字段时就出错,如何避免?
 
使用异常处理
if not TmpQry.Prepared then TmpQry.Prepare;
try
TmpQry.ExecSQL;
except
//do something
end;

也可以这样
每次赋值时把Query1.FieldBYyName('aaa').AsString非法字符去掉
 
to menye:
使用异常处理是不行的,像这样的话是避免了错误提示,但也就没有把这条记录成功写入。
去除非法字符我感觉是很困难的,因为Query1.FieldBYyName('aaa').AsString的值有汉字,
字母,等各种类型,出现非法字符的种类也很多,不好去除。
 
可能在这种语句里不支持使用参数
我在ORDER BY中使用参数也同样不成功
 
你可以这样试试
TmpQry.Close;
with TmpQry.SQL do
begin
Clear;
Add('INSERT INTO aa (a,b)');
Add('VALUES '''+Query1.FieldBYyName('aaa').AsString+''',');
add(''''+Query1.FieldBYyName('bbb').AsString+''')');
end;
TmpQry.ExecSQL;
 
to dmg
你的情况我也遇见的,我的做法是把非法的字符去掉,非法字符我目前就去掉这几个
',",%,? 就可以,这是我写的函数
{ 替换非法的字符 }
function Replacestr(const strOld:string):string;
var
strFind:string;
i,j:integer;
blnFind: Boolean;
begin
Result := '';
blnFind := False;
strFind:=''''+'?'+'"'+'`';
for i:=1 to length(strOld) do
begin
for j:=1 to 4 do
begin
if strOld = strFind[j] then
begin
blnFind := True;
break;
end;
end;
if blnFind = False then
Result := Result + strOld;
blnFind := False;
end;

end;
 
顶部