PHP에서 MSSQL에 XML 데이타 넣을때 삽질

PHP에서 MSSQL서버로 접속해서 XML형태의 데이타를 넣을때
Update Failed because SET option CONCAT_NULL_YIELDS_NULL  어쩌구 저쩌구
이렇게 뜨면 아래 내용참고 해서 SET Option을 조절해 준다.

ODBC를 이용할때 기본적으론 해당 옵션이 켜져있지 않은 모양.

Robert at realjax dot com
14-Jun-2005 10:00

A view that worked fine when queried from any other environment was giving me strange results when queried from PHPThe problem is that the MS SQL database settings are not set to the ANSI defaults as when connecting through Microsoft productsThe setting CONCAT_NULL_YIELDS_NULL defaults to ON when connecting with ODBC or SQL Query Analyzer, which complies with the ANSI standardHowever, this defaults to OFF when connecting through PHPThere are many other settings which may also need to be explicitly set.
<?
php
mssql_query
(‘SET CONCAT_NULL_YIELDS_NULL ON’, $hd);
?>

우왕ㅋ굳ㅋ
땡큐 로버트

PHP + MSSQL 사용시 걸리는문제

내가 삽질했던점.

1. 과연 사용할수 있는가?
윈도우의 경우 ntwdb어쩌구 하는 dll이 있어야 사용할수 있음.
PHP 패키지 깔때 자동으로 깔리는 DLL은 버전이 낮아서 MSSQL 2005에서는 사용이 안됨. DLL의 교채가 필요.

유닉스의 경우 FreeTDS 어쩌구를 깔고 –with-mssql 옵션을 주고 컴파일 해야함.

2. SP는 사용가능한가?
사용가능함. mssql_execute, mssql_bind, mssql_init 등의 함수를 사용하면 됨.

3. MSSQL에서 새롭게 지원하는 unicode 관련 필드 지원
우선 PHP의 윈도우던 UNIX던 MSSQL의 유니코드필드는 지원이 안되는것 같다.
MS 쪽에서 DB-LIB, ODBC를 업그레이드 시켜주지 않아서 그런다고 함.
꽁수로 select를 할때 해당 필드를 varchar, text 등으로 캐스팅해서 사용해야 함.

4. 특정필드의 데이타가 4000바이트를 넘을수 없는문제.
현재 삽질중.
MSSQL이라서 생기는 문제는 아니라고 생각함.

5. 한글이 깨지는 문제.
아 몰라 왜그래 짜증나

인라인 함수 초 삽질.

class Foobar
{
private:
  CMgr* m_pDB;
 
public:
  Foobar();
  ~Foobar();
 
  void SetDB(CMgr* pDB) { m_pDB = pDB;)
}

오늘 대략 이런 코드를 짜서 초개삽질.
뭐가 틀렸냐면…

void SetDB(CMgr* pDB) { m_pDB = pDB;)  // <– 여기 함수문닫는 부분을 } 로 안하고 ) 로 함

….아 VS 에러코드 엄청나게 나옴.

error C2059: 구문 오류 : ‘문자열’
rror C2238: ‘;’ 앞에 예기치 않은 토큰이 있습니다.
error C2059: 구문 오류 : ‘문자열’
rror C2238: ‘;’ 앞에 예기치 않은 토큰이 있습니다.

error C2059: 구문 오류 : ‘문자열’
rror C2238: ‘;’ 앞에 예기치 않은 토큰이 있습니다.
fatal error C1003: 오류 수가 100개를 초과했습니다. 컴파일을 중지합니다.

이런 에러 메세지가 나올경우 저런 상황을 의심해보자.

C# double 형의 NaN 값

C#의 double 의 NaN 값은 그냥 바로 변수끼리 “==” 연산자를 통해서 비교가 안된다.

  1. if( currentX == double.Nan)
  2. {
  3.     ….
  4. }

이런 코드 안통한다.
double.IsNaN() 함수를 쓸것.

음… 이것때문에 캐삽질 -_-;;; 크어
그러고 보니 C++은 어떻게 하더라  

삽질 – 005 :: make 파일 메크로 선언 삑사리

어제의 삽질(http://lagoons.net/tt/index.php?pl=163)에 이어서 오늘 즐거운 마음으로 make 파일에 오브젝트 파일목록을 정리 하고 컴파일!

….

크아 뭐냐 이 미칠듯한 에러는! 이번에도 미칠듯한 링크에러!

오늘 오전내내 삽질해서 원인을 찾아냈다. (젠장젠장젠장!)

# 라이브러리 설정
LIB_A = ../A/libA.a
LIB_B = ../B/libB.a

위에 처럼 make파일에 선언을 해놓고
g++로 컴파일 명령선언은

$(CC) -o out main.o $(LIB_a) $(LIB_B)

이런식으로 해놓은것…
LIB_a는 없는 매크로라서… make 파일에서 실제 저 명령을 실행시킬때는

g++ -o out main.o ../B/libB.a
이렇게 된거다. 즉 A라는 라이브러리가 링크되지 않은것..

닝기미……………………. 저렇게 써놔서 눈에 띄지만 실제 선언은 꽤 길어서…찾기 힘들었다.

삽질 – 004 :: 라이브러리의 특정 객체를 사용할때만 링크에러가 날때

라이브러리 전체가 다 안되던지 다 되던지 둘중에 하나일 것이지 특정클래스를 사용할때만 링크 에러가 발생할 경우.

해당 라이브러리 컴파일시 그 클래스만 컴파일을 안했거나 라이브러리로 만들지 않았거나 이 클래스를 사용한다(export명령)는 명령어를 안써줬을때.

당연하잖아… T_T
오늘 이것때문에 도대체 몇시간을 삽질을 한거야!

처음엔 윈도우 였다. 어떤 클래스를 DLL 에 만들고 EXE에서 사용하는데 계속 링크에러가 난다.
원인은? 이 클래스를 EXPORT 한다는 명령어를 class 선언에 안붙여 줬다…… 이걸로 한 한시간??

두번째는 리눅스였다. 역시나 특정 클래스를 사용할때만 링크에러가 난다….. 원인을 모르겠다. 아무리 찾아도 모르겠다.

..
.

씨바 라이브러리파일 만들때 해당 오브젝트 파일을 포함안해줬다.

아 이걸로 한 4시간………………………………………..

어버어버버어버어버ㅓ버ㅓ어버어버ㅓ어버어버업업
ㅣㅇ너린엏ㄴ;ㅇ한ㅇ;헌
ㅎㄴ엏ㄴ엏ㅈ도허
]ㅔㅎ
해ㅓ

해ㅓㄴ한ㅇㅎ

헐헌
[ㅐ5ㅗㅓㅓㅜㅗ
버3ㄱ
ㅐ헝ㄹ

삽질 – 003 :: 파일오픈시 플래그값 에러

file.open(strFilename.c_str(), ios::out || ios::trunc);
에 따른 에러코드

no matching function for call to `
std::basic_fstream >::open(const char*, bool)’
/usr/include/c++/3.2.2/fstream:557: candidates are: void
std::basic_fstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode =
(std::ios_base::in | std::ios_base::out)) [with _CharT = char, _Traits =
std::char_traits]

틀린게 없어 보이지만…(나는 없어 보였다.. T_T)
ios::out || ios::trunc 의 결과는 bool 값이 된다. || 가 or 연산자이기 때문이다.

VC++ 7.0 warnning level 3 에서는 문제없이 컴파일 된다. bool 로 나온값을 어떻게 처리하는지는 모르겠다. 자동으로 32bit 데이타 타입으로 변환되고 그값이 다시 그 플래그 값으로 변환이 되는게 아닐까 한다.

저 코드는

file.open(strFilename.c_str(), ios::out | ios::trunc);

으로 수정해서 비트연산을 하게 해줘야 된다.
후….이건 정말 삽질에 어울리는 포스팅인듯..(이른바 주옥같은 삽질들)

나와 같은 삽질을 하고 그에 대한 답을 준 사람들
http://www.spinics.net/lists/gcchelp/msg05558.html

마틴에게 감사를…
Thx Martin

ps.
왜 틀렸는지 알고 나서 보면.. 저 위의 에러코드에 답이 들어있다.
….젠장!

삽질 – 002 :: transform, toupper 컴파일시 에러

gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) 에서 발생했음.

…쩝 STL 오류코드 보느라 눈깔빠지는 줄 알았는데..
transform( s1.begin(), s1.end(), s1.begin(), tolower );
이 코드의 경우 VC 에서는 문제없이 돌아가는데 gcc에서는 toupper 인자, 리턴형 문제때문인지

no matching function for call to `transform(
__gnu_cxx::__normal_iterator std::char_traits< char >, std::allocator< char > > >,
__gnu_cxx::__normal_iterator< char*, std::basic_string < char,
std::char_traits< char >, std::allocator< char > > >,
__gnu_cxx::__normal_iterator std::char_traits< char >, std::allocator< char > > >, < unknown type >)’

이딴 썩을 에러코드를 뺃으면서 컴파일이 안된다.
해결방법은
transform( s1.begin(), s1.end(), s1.begin(), (int(*)(int))tolower );
로 수정. 즉 toupper 의 인자와 리턴형을 명시적으로 int형으로 수정해준것이다. 소스코드를 봐봐야 알겠지만 위에서 언급한 컴파일러의 빌트인 펑션 touuper 변수와 리턴형이 아마도 char로 되어있는게 아닌가 싶다.
(…엇…char로 되어있어야 더 잘되야 되는거 아냐?!
…귀찮다…)

냠…어쨋든 메모메모.

ps. 저렇게 해놓는게 올바른 방법인지는 모르겠다.