2014-10-02 3 views
-2

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; 

이 물건은 대부분의 경우에 작동합니다. 하지만 가끔은 동일한 단어로 내 함수는 않습니다 일반적으로 너무 많은 따옴표 예를 추가

I''m 

있도록 SQL 문을 삽입 I''m가 분명히 작동 할 때. 하지만 가끔은,이 코드 버그는 이유는 나도 몰라하며 삽입 :

I'''''''''''''m 

(인용 부호의 수는 여기에 임의 ARES). idk 왜, 그것은 따옴표를 추가하는 것을 끝내지 만 idk는 때로는 잘 작동하고 때로는 버그가되고 너무 많은 따옴표를 추가합니다.

대부분의 경우 따옴표가 올바르게 중복됩니다. 하지만 가끔 idk 왜 미쳐 가고 너무 많은 따옴표를 추가합니다.

Insert into mytable values('I''m quoted','I am not'); 

이 작동합니다 : 나는 따옴표를 두 배로 찾아서있어

은 당신이 그들을 탈출을 두 배로 같은 테이블에 적절하게 삽입 할 수 있어야 SQL에서 발생합니다. 그러나 나는 덧붙인다.

Insert into mytable values('I'mquotes','I am not'); 

나는 그것이 하나의 값으로 받아 들여지고 I와 m을 구분하는 버그를 만들 것이기 ​​때문에 버그가 생길 것이다. 그러나 나는 당신이 그것을 알고 있다고 생각한다.

어쨌든 내 doublequoting 기능이 작동하지 않습니다. 그걸 잘못 생각해 내도록 도와 주실 수 있습니까? 내 논리가 틀렸어? 고맙습니다.

+0

내장 된 QuotedStr? – MartynA

+0

당신은 이미 내장 방법이 진지한가? x) – user28470

+4

매개 변수를 사용하면 .... – bummi

답변

4

여기서 유일한 대답은 지원하는 모든 플랫폼에서 매개 변수화 된 쿼리를 사용하는 것입니다. 처음에는 짜증나거나 실망스럽게 보일 수도 있지만 훨씬 더 좋으며, 사용하지 않을 경우 피하려고하는 좌절감이 있습니다. 일단 익숙해지면 사실 쉽고 빠릅니다.

+0

그래, 얼마나 많은 변수가 있는지 모르겠다. 나는이 일을 처음으로해야했다. 어쨌든 나는 큰 따옴표로 작업했다. – user28470