Sql 字符串中的双引号

Sql 字符串中的双引号,sql,delphi,insert,double,quotes,Sql,Delphi,Insert,Double,Quotes,我正在Delphi中使用Ado进行sql查询(插入)。我的一些插入有带引号的值。因此,为了用引号插入它们,您需要将它们加倍。所以我做了一个函数: 我在这里的逻辑是使用while循环,因为我将修改我检查的单词的长度,这样我就可以控制增量变量,并且我可以正确地增量,以避免出现无止境的循环。所以我检查字符串的每个字符,如果它是引号,我会在其中添加另一个 下面是我使用的代码: //Search if there are ', if yes we need escape them if P

我正在Delphi中使用Ado进行sql查询(插入)。我的一些插入有带引号的值。因此,为了用引号插入它们,您需要将它们加倍。所以我做了一个函数:

我在这里的逻辑是使用while循环,因为我将修改我检查的单词的长度,这样我就可以控制增量变量,并且我可以正确地增量,以避免出现无止境的循环。所以我检查字符串的每个字符,如果它是引号,我会在其中添加另一个

下面是我使用的代码:

    //Search if there are ', if yes we need escape them
    if Pos('''', aSourceData[i,j]) <> 0 then
      begin
        long := 0;
        While long < Length(aSourceData[i,j]) do
          begin
            if aSourceData[i,j][long] = '''' then
              begin
                //here we found a ' copy string to it and double '
                aSourceData[i,j] := Copy(aSourceData[i,j], 0, long) + ''''
                                   + Copy(aSourceData[i,j], long+1, Length(aSourceData[i,j]));
                //we modified the string so the length of the word changed
                //make sure to increment correctly or it's a endless loop
                long := long +2;

              end;
            //Increment
            long := long +1 ;
            //if we don't check if the last character isn't a '
            //the loop will end before checking it and cause errors in sql string
            if (long = Length(aSourceData[i,j])) AND (aSourceData[i,j][long] = '''') then
              begin
                //double the ' if found at the last position
                aSourceData[i,j] := aSourceData[i,j] + '''';
                break;
              end;
          end;
      end;
因此,当insert
I'm
使用sql语句时,它显然会起作用。但有时,这段代码会对idk why产生bug,并插入:

I'''''''''''''m
(此处引用的数量是随机的)。idk为什么,它最终会停止添加引号,但idk为什么有时它工作得很好,有时它会出错并添加太多的引号

问题是,在大多数情况下,它会正确地将引号加倍。但有时idk会解释为什么它会变得疯狂,并添加太多的引用

我正在搜索双引号,因为在SQL中,您必须将它们加倍才能转义,并能够将其正确插入表中,如:

Insert into mytable values('I''m quoted','I am not'); 
这会奏效的。但我补充说

Insert into mytable values('I'mquotes','I am not');
它将创建一个bug,因为它将I作为一个值,然后它将搜索分隔I和m的coma。但我想你知道这一点


无论如何,我的双引号功能不起作用。你能帮我找出它的毛病吗?我的逻辑错了吗?谢谢。

在任何支持它的平台上,这里唯一的答案就是使用参数化查询。虽然一开始它看起来很烦人或令人沮丧,但它要好得多,值得你通过不使用它们来避免任何挫折。一旦你习惯了它们,它们实际上会变得更简单、更快。

只需使用参数……啊!!!!使用参数。顺便说一句,即使QuotedStr()不存在,StringReplace()函数也允许您将自己的等效语句编写为一条语句。@MartynA在参数和手工生成的查询之间进行选择并不是一件容易的事。看起来您似乎并不真正理解SQL注入。即使没有SQL注入,您自己尝试引用查询也会使您的生活变得不必要的复杂。当参数立即解决问题时,为什么要花时间研究如何做到这一点?显然,你做什么完全取决于你自己。但你确实征求了意见。是的,我只是不知道有多少参数,而这样做是我的第一个想法。无论如何,我用双引号使它工作
Insert into mytable values('I'mquotes','I am not');