C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[6693] Re:SQL 기본 문법 질문
홍성진 [heaven] 2942 읽음    2001-04-09 15:06
권선미 님이 쓰신 글 :
: SQL문에 어떤 문제점이 있는지 모르겠어여..
:   
: Query2->SQL->Add("Update EVENTCONF Set EVT_CLASS = "+class_num+",EVT_LEVEL= '"+level+"',
:                   EVT_FLAG = "+flag+",EVT_STATUS = "+status+",EVT_DESC = "+desc+"
:                   Where EVT_CODE = "+code+");
: Query2->Open();
:
:
: 물론 class_num, level, flag 등등은.. 변수로 선언되어 있구여...
: 컴파일을 하면 class_num 바로 뒤의 +기호 앞에서 invalid pointer addition에러가 나거든요..
: 뭐가 문제인가여?

안녕하세요.

제가 보기에 SQL문법의 문제가 아니구요. C++의 문법문제로 보이네요.

문자열결합에서 문자열+문자열은 허용되지 않습니다.
물론 문자열+숫자도 안되죠. 문자열+숫자의 경우는 포인터를 이동시키기 때문에
에러는 안나겠지만, 로직에 문제가 생기겠죠.

문자열+문자열이 가능하게 하려면, 둘중의 하나가 AnsiString 형이어야 합니다.
AnsiString은 operator +를 처리할수있는 메쏘드가 있기때문에 위와같은 에러가
발생하지 않습니다.

위의 예를 보면...

AnsiString str1;
str1 = "abc"+"def"; <- invalid point addition에러가 발생합니다.

위의경우 다음과 같이 고치면 됩니다.

AnsiString str1;
str1 = AnsiString("abc")+"def";
이렇게 하면 더하기전에 AnsiString으로 type casting을 하기때문에 위와같은 에러가
발생하지 않습니다.


AnsiString str2;
str2 = "abc"+1; <- 이경우 포인터가 이동하여 str2에는 "bc"가 들어가게 됩니다.

str2자체는 "abc"가 있는 메모리상의 주소를 가지게 되는데, 대입하기전에 +1를 했으니
포인터가 한자리 이동하겠죠.

str2 = AnsiString("abc")+1;
이렇게 하게되면 str2="abc1"을 가지게 됩니다.

님의 경우 위처럼 사용하지 마시고, AnsiString에서 제공하는 printf나 sprintf를
이용하면, 실수를 줄일수 있습니다.

//-----------------------------------------------------------------------------------
이렇게 해보세요.
AnsiString strQry;
strQry.printf("Update EVENTCONF Set EVT_CLASS = %s,EVT_LEVEL= '%s',
                   EVT_FLAG = %s,EVT_STATUS = %s,EVT_DESC = %s
                   Where EVT_CODE = %s", class_num, level, flag, status, desc, code);

Query2->SQL->Clear(); 대입전 클리어합니다.
Query2->SQL->Add(strQry);
Query2->Open();

위에서 모든 변수는 스트링으로 처리했습니다. 그것은 님께서 적절히 변환하세요.
위의 포맷중에 EVT_LEVEL='%s'는 데이타베이스에서의 데이타타입이 스트링일때 사용합니다.
value앞뒤로 작은 따옴표가 붙죠.
나머지는 데이타베이스에서의 데이타타입이 숫자형이라 생각하고 처리한것입니다.

알맞게 변환하세요.
주의...위에서 사용한 변수타입과, 데이타베이스의 데이타타입은 상관이 없습니다.

그럼...


+ -

관련 글 리스트
6691 SQL 기본 문법 질문 권선미 2192 2001/04/09
6693     Re:SQL 기본 문법 질문 홍성진 2942 2001/04/09
6692     Re:SQL 기본 문법 질문 방태윤 2165 2001/04/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.