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

델파이 Q&A
Delphi Programming Q&A
[12435] Re:Re:Re:[질문]Delphi2007에서 DBExpress사용시 한글로된 필드값변경시 오류
박지훈.임프 [cbuilder] 2601 읽음    2009-02-12 08:36
저도 직접 테스트를 해봤는데, 말씀하신대로더군요. 저도 여러가지로 이상해서 좀 더 테스트를 해봤는데...
다음과 같은 결과를 얻었습니다.

1. 디자인타임에 쿼리 컴포넌트에 SQL문을 직접 넣은 경우에는 한글 필드명과 무관하게 제대로 동작했습니다.
동적으로 SQL문을 지정한 경우에만 문제가 발생하더군요. 물론 디자인타임에서 SQL문을 지정했더라도 코드로 다시 SQL문을 재지정한 경우에는 동일한 문제가 발생합니다.

2. 보여주신 두 코드들 중에서 앞서의 create문과 무관하고, 파라미터를 사용하는 SQL문에서 한글 필드명을 사용한 경우에만 문제가 발생합니다. 예를 들면 같은 insert 문이라도 필드 이름을 전혀 지정하지 않고 모든 필드의 값을 다 지정하는 방식, 즉 insert into values (...) 이런 코드를 사용할 때는 문제가 발생하지 않더군요.

3. 필드명과 관련된 것은 분명한데, 구글에서 검색해보니 반드시 한글일 경우만 문제가 생기는 것이 아니고 한글이 아닌 환경, 그리고 델파이/C++빌더가 아닌 ASP 환경에서도 영문 필드명을 썼는데도 필드명과 관련하여 비슷한 문제가 발생하는 경우가 많이 있었습니다. (0x80040E10 에러 코드로 검색해보시면 많이 나옵니다) 정확한 발생 원인은 알아내지 못했지만 이 문제가 델파이/C++빌더에만 관련이 있는 문제는 아니고 근본적으로는 SQL 서버 혹은 그 앞단의 드라이버쪽에서 문제가 시작되는 것으로 보입니다.

이렇게 SQL 서버 혹은 드라이버를 의심하는 이유는, 중간에 코드를 더 넣어서 체크를 해봐도 델파이 코드상에서는 Param 갯수가 2개만으로 나오는데도 불구하고 SQL 서버는 파라미터가 더 있는 것으로 인지하는 것으로 보이기 때문입니다. 물론 SQL 서버의 매니지먼트 스튜디오 등으로 실행했을 때는 이런 문제를 보기 어려운데, 그것은 단지 파라미터 전달이 아닌 직접 값을 지정한 SQL문을 쓰기 때문입니다.

4. 델파이/C++빌더 2009에서는 그런 문제가 발생하지 않습니다. 똑같은 코드의 소스로 테스트를 해봐도 2007에서만 오동작이 일어나고 2009에서는 아무런 문제 없이 동작하더군요. 2009에서는 그런 문제점을 인지하고 패치를 한 듯 합니다.


이용남 님이 쓰신 글 :
: 테스트해본 결과 파리미터 생성과는 무관했습니다.
: 한글로 된 기존 테이블을 영문으로 변경후 아래 코드로 Insert하면 정상적으로 실행되더군요.
:
: procedure TForm1.CONFIG2_ADDDB;
: begin
:   try
:     With UpdateQry do Begin
:       Close;
:       SQL.Clear;
:       SQL.ADD('CREATE TABLE SRVCONFIG2 ');
:       SQL.ADD('(ServerName  VARCHAR(20), ');
:       SQL.ADD(' CardIp      VARCHAR(15)) ');
:       ExecSql;
:       Close;
:     end;
:   except On E:Exception do
:     MessageDlg(#13+E.Message+#13#13+'CONFIG Table 생성오류.', mtError, [mbOK], 0);
:   end;
: end;
:
: procedure TForm1.Button4Click(Sender: TObject);
: begin
:   With UpdateQry do begin
:     Close;
:     SQL.Clear;
:     Params.CreateParam(ftString, 'SNAME', ptInput);
:     Params.CreateParam(ftString, 'CIP', ptInput);
:     ParamByName('SNAME').AsString := '\\192.168.0.20';
:     ParamByName('CIP').AsString   := '192.168.0.20';
:     SQL.Text := 'INSERT INTO SRVCONFIG2 ' +
:                 '(ServerName, CardIp ) VALUES (:SNAME, :CIP)  ';
:    ExecSql(False);
:   end;
: end;
:
: 결국 한글 필드명을 가지고 있는 기존테이블의 필드명을 영문으로 바꿔서 해결은 했는데
: Delphi2006의 dbxmss30.dll과 2007의 dbxmss30.dll의 한글 처리부분에 차이가 있다는
: 생각밖에는 ...
:
: 박지훈.임프님 답변 감사합니다.
:
:
: 박지훈.임프 님이 쓰신 글 :
: : 확실한건 테스트를 해봐야 하지만... 제가 기억하는 거로는...
: : 레코드를 인서트하는 코드를 보면, 파라미터를 생성하는 코드가 먼저 오고 그 다음에 그 파라미터를 이용하는 SQL문을 지정했습니다. 그런데... SQL문을 지정하는 코드에 이르면, SQL문이 실제로 지정되기 전에 내부적으로 이전 SQL문을 삭제하고 그에 따라 파라미터들을 다 삭제합니다. 파라미터 자체가 아예 없어지는 겁니다. 그런 후에 SQL문이 실제로 지정되는 과정에서 SQL 내부에서 쓰인 파라미터들이 자동으로 다시 생성됩니다.
: :
: : 다시 말해, SQL 문 지정 이전에 파라미터를 생성하고 값을 지정한 것이 그냥 사라지는 거죠.
: : 먼저 SQL 문을 지정한 후에 파라미터 값을 지정해야 합니다.
: :
: : Params.CreateParam() 함수는 파라미터를 생성하기 위해서 쓰신 것일텐데, SQL 문 지정에서 자동으로 파라미터가 생성되므로 다시 만들면 안될 겁니다. 일반적으로 Params.CreateParam() 함수는 이런 목적으로는 사용되지 않고 특수한 경우가 따로 있습니다.
: :
: :
: : 이용남 님이 쓰신 글 :
: : : 데이타베이스 : SQL Server2000
: : : 개발언어       : Delphi2007
: : :
: : : 한글 필드명으로 구성된 테이블의 Insert, Update시 오류 발생문제
: : :
: : : procedure TForm1.CONFIG_ADDDB;
: : : begin
: : :   try
: : :     With UpdateQry do Begin
: : :       Close;
: : :       SQL.Clear;
: : :       SQL.ADD('CREATE TABLE SRVCONFIG ');
: : :       SQL.ADD('(서버명  VARCHAR(20), ');
: : :       SQL.ADD(' 카드IP  VARCHAR(15)) ');
: : :       ExecSql;
: : :       Close;
: : :     end;
: : :   except On E:Exception do
: : :     MessageDlg(#13+E.Message+#13#13+'CONFIG Table 생성오류.', mtError, [mbOK], 0);
: : :   end;
: : : end;
: : :
: : : 위의 코드로 생성된 테이블에 값을 입력하면
: : :             With UpdateQry do begin
: : :               Close;
: : :               SQL.Clear;
: : :               Params.CreateParam(ftString, 'SNAME', ptInput);
: : :               Params.CreateParam(ftString, 'CIP', ptInput);
: : :               ParamByName('SNAME').AsString := '\\192.168.0.20';
: : :               ParamByName('CIP').AsString   := '192.168.0.20';
: : :               SQL.Text := 'INSERT INTO SRVCONFIG ' +
: : :                           '(서버명, 카드IP ) VALUES (:SNAME, :CIP)  ';
: : :               ExecSql(False);
: : :             end;
: : :
: : :
: : : "필요한 매개변수중 한 개 이상에 값이 주어지지 않았습니다." 라는 오류 발생
: : : 참고로 Delphi2006에서는 이상없이 잘 실행된 코드인데 Delphi2007 업그레이드후 나타난 증상입니다.
: : :
: : : 테이블 생성은 문제가 없는데 ... 답답한 마음에 몇글자 적어봅니다.

+ -

관련 글 리스트
12407 [질문]Delphi2007에서 DBExpress사용시 한글로된 필드값변경시 오류 이용남 2099 2009/02/04
12422     Re:[질문]Delphi2007에서 DBExpress사용시 한글로된 필드값변경시 오류 박지훈.임프 2011 2009/02/07
12428         Re:Re:[질문]Delphi2007에서 DBExpress사용시 한글로된 필드값변경시 오류 이용남 2041 2009/02/10
12435             Re:Re:Re:[질문]Delphi2007에서 DBExpress사용시 한글로된 필드값변경시 오류 박지훈.임프 2601 2009/02/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.