Q&A

  • [요청]Query컴포넌트의 params 속성의 의미 좀
안녕하세요.. 델파이를 배우고 있는 회사원입니다.

제가 물어볼 것은 DbAccess/query컴포넌트의 Params속성에 대해서 자세하게

알고 싶습니다. 아무리 델파이 책을 찾아봐도 제가 이해할 수 있을 만큼

자세하게 나와 있지 않아서요..

꼭 부탁드립니다.

2  COMMENTS
  • Profile
    백승환 1999.06.11 08:28
    최선기 께서 말씀하시기를...

    > 안녕하세요.. 델파이를 배우고 있는 회사원입니다.

    > 제가 물어볼 것은 DbAccess/query컴포넌트의 Params속성에 대해서 자세하게

    > 알고 싶습니다. 아무리 델파이 책을 찾아봐도 제가 이해할 수 있을 만큼

    > 자세하게 나와 있지 않아서요..

    > 꼭 부탁드립니다.



    도움이 되실지...



    제가 아직 초보이므로 제가 알고, 이해한 데로만 설명을 드릴께요...



    보통 Query는 실행중에 인자들(Parameters)을 사용자로 부터 받아들여서



    자료를 (조건)검색,추가,수정,삭제를 위해서 사용하는 기본적인 컴포넌트지요.



    따라서 인자(Parameter)를 어떻게 SQL문에 전달해서 사용하느냐가 기본입니다.



    제가 자판기설치 프로그램을 하나 짠다고 하구요. 자판기를 어느 건물에 설치



    했는가를 확인하는 작업을 해보면요.



    일단 테이블(DBF)인 CAN 은 자판기번호(CANID),건물명(GMNAME) 로 되어있구요.



    자판기번호(CANID : Integer), 건물명(GMNAME : String) 입니다.



    사용자에게 자판기번호(CANID)를 받아서 설치된 건물명을 찾으려는 거지요.



    Query.Name 은 Query1 이구요.



    Query1.SQL 은 아래와 같습니다.



    select GMNAME

    from CAN

    where CANID=:CANID (넘 쉽군요.^..^) 뒷쪽의 :CANID가 인자입니다.



    여기서 우리는 CANID를 ParamByName 이라는 프로시져(Procedure)를 사용해서



    Query1.ParamByName('CANID').Value := StrToInt(MaskEdit1.Text);



    요렇게 인자(Parameter)를 전달하는 거죠.



    자. 이제 설명을 하는데요... Query가 SQL 을 실행할때 데이터형(Data Type)을



    정해주지 않으면 묵인된 에러를 발생시키게 되거든요. 프로그래밍의 가장 기본



    은 데이터(자료)니까요. 데이터형을 정확히 정해주지 않으면 안되거든요.



    특히 SQL문으로 자료를 동적으로 찾아오는 Query에서는 아주 중요한 것이지요.



    에구~~ 아는게 없느니 설명이 너무 빈약하네요....











  • Profile
    박성훈 1999.06.11 01:36
    최선기 께서 말씀하시기를...

    > 안녕하세요.. 델파이를 배우고 있는 회사원입니다.

    > 제가 물어볼 것은 DbAccess/query컴포넌트의 Params속성에 대해서 자세하게

    > 알고 싶습니다. 아무리 델파이 책을 찾아봐도 제가 이해할 수 있을 만큼

    > 자세하게 나와 있지 않아서요..

    > 꼭 부탁드립니다.



    아래 프로시져를 보죠.

    procedure Button1Click(Sender: TObject);

    begin

    with Query1 do begin

    Close;

    sql.Clear;

    sql.Add('SELECT * FROM "Customer.db"');

    sql.Add(' WHERE Name=:MyName');

    parambyname('MyName').AsString:=edit1.text;

    Open;

    end;

    end;



    이런 구문이 있다고 하면,



    다른 방식으로는

    sql.Add(' WHERE Name=''' + edit1.text + '''');

    와 같이 폼에 입력박스를 놓고 입력박스에 내용과 고객테이블의 이름을 비교할 수 있겠죠?

    여기서 ''' + edit1.text + ''''와 같이 쓸 때는 덜 복잡하지만 여러 컴포넌트에 있는 값을 받아 온다고 하면 복잡해 지겠죠.

    그러나 param속성을 쓰면 비교문자('')를 쓰지 않고 sql문안에 집어 넣을 수 있으므로 읽거나 쓰기가 쉬워집니다.

    where절에 들어간 MyName은 sql문에 들어갈 변수가 되는 것이고 바로 밑의 문장은 param속성을 써서(table컴포넌트의 fieldbyname과 같은 식으로) where절에서 집어넣은 param변수에 들어올 값을 집어 넣어주는 겁니다. 형식은



    query1.parambyname('파람변수이름').As데이터형 := 값;



    와 같이 씁니다. 주의 하실것은 예를 든 고객테이블의 고객명의 필드타입이 String이라고 하면 As데이터형은 고객명필드의 데이터타입과 같이 AsString이라고 써줘야 합니다. 그리고 값도 똑같은 데이터형이어야만 합니다.



    혹 시간이 되시면 DateTimePicker컴포넌트를 두개 폼에 얹어 놓고(하나는 시작일, 하나는 종료일에 해당함.) 기간이 들어 있는 테이블에서(기간의 타입은 Date형) 기간별 검색을 해보세요. where between Adate And Bdate구문을 쓰셔서요. 그냥 컴포넌트에서 직접값을 받아서 말이죠. datetimepicker의 값은 date라는 속성에서 받아오시면 되구요.



    제 경험상 param속성을 안쓰시면 이상하게도 테이블의 날짜와 Datetimepicker의 데이터형이 다르다는 에러가 뜰겁니다. 에러가 나신다면 param속성을 써보세요.

    이해가 가셨는지. 두서가 없어서...