|
권선미 님이 쓰신 글 :
: 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앞뒤로 작은 따옴표가 붙죠.
나머지는 데이타베이스에서의 데이타타입이 숫자형이라 생각하고 처리한것입니다.
알맞게 변환하세요.
주의...위에서 사용한 변수타입과, 데이타베이스의 데이타타입은 상관이 없습니다.
그럼...
|