Sql没有在delphi xe5中显示记录

时间:2014-03-14 12:19:03

标签: delphi-xe5

我有以下问题。

当我使用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;

我可以知道如何克服这个错误吗?

1 个答案:

答案 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;