Q&A

  • MSSQL에서 nChar에 데이타 입력방법 ?
MSSQL 7, DELPHI 5,0을 사용하고 있습니다.
MSSQL에서 Field의 Type을 nChar 로 했는데
UPDATESQL 에서 사용을 하려면 에러가 납니다.

예: Query1.FieldByName('Test').AsString := '연습입니다.';

하면 Test 필드가 없다고 에러가 납니다.
물론 Test 필드는 유니코드를 저장하기 위하여 nChar(20) 으로
정해놓았습니다.

답변들을 찾아보니 N 을 Field 앞에 붙여 써야 한다고 하는데
어떤 방법으로 써야 하는지...

FieldByName('NTest')AsString 도 에러가 나고
FieldByName(N'Test').AsString 도 에러가 납니다.

알고계신분의 답변 부탁드립니다.
감사합니다.
2  COMMENTS
  • Profile
    마코디 2004.02.18 02:57
    NCHAR, NTEXT, TEXT, BLOB, CLOB 필드 타입은

    델파이에서 다룰때

    AsString 으로 하는것이 아니라

    AsMemo 또는 AsBlob으로 처리하셔야 정상처리됩니다.
    바이너리 타입 데이터(그림, 파일 포함 됩니당)의 경우 AsBlob으로 하시고
    스트링인 경우 AsMemo로 처리하시면 됩니다.

    특히 BDE를 쓰실경우 대용량 필드의 값은 캐쉬와 블럭 사이즈가 넘치는 경우가 많으니까 미리 오버플로우를 방지하기 위해서 크기를 늘려서 사용하시는게 현명합니다. ^^*


  • Profile
    마코디=마ㄱ코디ㅇ 2004.02.20 22:47
    조금 풀어서 말씀드려볼께요.

         바이너리 타입의 데이터 형은 AsBLOB 으로 처리하고

         일반 스트링인 경우는 AsMemo 로 하시면 처리가 된다는 뜻입니다.

         이 말뜻은 델파이가 봤을 때 MS DBMS의 TEXT, NTEXT, BLOB, CLOB 필드 타입은

         모두가 BLOB으로 처리된다는 의미입니다.

         뿐만아니라 varchar 타입도 길이가 너무 크면 BLOB 으로 간주됩니다.

         따라서 위 필드의 타입들은 결국  델파이에선 BLOB으로 보이는 것이고

         내용물에 따라 AsMemo 와 AsBLOB으로 구분해서 처리해야하는 것입니다.  



         예컨데 VARCHAR(8000) 의 크기로 만들어진 필드의 값을 델파이로 끌어올 경우

         AsString으로는 처리 못합니다.

         이럴땐 AsMemo 로 가져옵니다.  

         그리고 이것을 만약 DBGrid 에 표현한다면

         Memo 라고만 표기 될 것입니다. 내용물이 디스플레이가 되질 않습니다.

         해당 필드 값을 직접 표시하고 싶다면 TDBMemo 사용하셔야 합니다..

         이것은 대용량 값을 메모리에 다 로딩하면 느려지기 때문에 이렇게 설계되어 있습니다.

        

         XML을 콜렉션 방식으로 BLOB 타입으로 만든 필드의 값을 델파이로 가져올때

         델파이에서 바이너리로 인식할 수 도 있지만 이것을 쿼리로 불러오면 AsMemo로

         처리해야 보입니다.

      

       그리고  

       3 티어로 구성하는 할때 특별히 다르지 않습니다. 즉,   디비 연산은 기본적으로 동일합니다.

       만약 3티어 구축하는 방법에 대한 기초적인 지식이 필요하시다면

       델파이에서 제공하는 MIDAS 컴포넌트에 대한 서적과 예제를 참고하시면 됩니다.
      


    예제 코드 부탁하셨는데 특별하게 없네요.


    try
    for i := 1 to RecCount -1 do
    begin
             if ((DataSource2 <> nil) and (StoredProc1.Fields[0].AsString <> '')) then
              begin
                    try
                    aBlobStream := TBlobStream.Create(TBlobField
                   (DataSource2.DataSet.FieldByName('AbstractText')), bmRead);
                     frmDisplay.Memo1.Lines.LoadFromStream(aBlobStream);
                     frmDisplay.Memo2.Lines.add( StoredProc1.Fields[1].AsMemo  + #9 + frmDisplay.Memo1.Text);
                    except
                     Recall;
                    end;
              end;
          StoredProc1.Next; //레코드 커서 이동
    end; // end of for i
    finally
       aBlobStream.Free;
       frmMainDBAgent.StatusBar1.SimpleText := '::::  BlobStream FREE  :::::';
    end;