我有以下问题。
当我使用SQL Select语句来过滤记录时,它会给出错误或者不显示应该记录的记录。
如果该字段有'在值中它给出了一个sql错误, 如果该值为(i&#m; m),则该错误表示sintax对于(i')不正确,因此单个'切断了sql语句的其余部分,
我尝试过使用代码来更改所有'进入"然后我没有得到错误,但我也没有得到任何记录。
以下是代码:
转换'进入":
Function RestoreFromsqlFormat(SQLText:String):String;
Var
Sqlnew,sqlold:String;
Begin
sqlold:=SqlText;
if Pos('"',SQLText)<>0 then
Begin
while Pos('"',sqlold)<>0 do
Begin
SqlNew:=Copy(SqlOld,0,Pos('"',SqlOld)-1)+'''';
SqlOld:=Copy(SqlOld,Pos('"',sqlOld)+1,Length(sqlOld));
End;
End;
Result:=SQlNew+SqlOld;
End;
当调用sql select from语句时,我收到以下错误:
Active:=False;
Sql.Text:='select*from backup_folders where (user_id='''+userID+''') and (folder='''+PreparesqlFormat('my name wouldn''t be here')+''')';
Active:=True;
我可以知道如何克服这个错误吗?
答案 0 :(得分:0)
这是使用SQL的错误方法。
删除PreparesqlFormat()函数并改为使用AnsiQuotedStr()
:
Active := False;
Sql.Text := 'select * from backup_folders where (user_id=' + AnsiQuotedStr(userID, #39) + ') and (folder=' + AnsiQuotedStr('my name wouldn''t be here', #39) + ')';
Active := True;
更好的选择是使用参数化查询。让DB处理报价:
Active := False;
// depending on which DB component you are using, you might need to use @ instead of :
Sql.Text := 'select * from backup_folders where (user_id=:PUserID) and (folder=:PFolder)';
ParamByName('PUserID').AsString := userID;
ParamByName('PFolder').AsString := 'my name wouldn''t be here';
Active := True;