델파이 4 사용자입니다.
join을 이용한 쿼리로 데이터를 DB그리드에서 열었습니다.
RequestLive 속성을 True로 하면 쿼리컴포넌트로 불러온 자료를 창에서 직접 수정할 수 있다고 해서 해 보았는데 조인을 해서 가져오면 "Table is Read Only" 라는 에러가 나옵니다.
질문1) 조인데이터도 창에서 직접 수정할 수 있는 방법이 있는지요.
차선책으로 쿼리컴포넌트로 불러온 필드값들을 DBEdit 에다 쓰지를 못하고 일반 Edit에다 일일이 써놓고 수정시 업데이트 쿼리를 만들어서 수정을 했습니다.
그런데 그리드안에서 아래위로 왔다갔다하면 "Invalid BLOB handle in record buffer"라는 에러가 뜹니다.
컴파일을 해서 해당 에러라인으로 가서 찍어보니 Query1.FieldByName("summary").asstring = Delphi exception EDBEngineerror at $624f985 라고 뜨는군요.
질문2) 질문1에서 해결이 되는 방법이 있다면 편리하겠지만 차선책 에서라도 잡을수있는 방법이 있을까요?
만일 Paradox DB를 사용하신다면 DBEdit나 DBGrid 등은 절대 사용하지 마시기 바랍니다.
테이블이 오픈된 상태로 Update되는 도중에 시스템이나 OS 등의 문제 등으로 커밋이 완전하게 수행되지 않은 상태에서 세션이 불안전하게 종료되어 테이블이 깨지거나, 입력한 데이터가 테이블에 저장되지 않는 등의 치명적인 원인을 제공하게 됩니다.
사용하는 DB가 어떤 것이든, DB 테이블의 장시간 오픈 상태는 그리 권장할 만한 사항이 못됩니다.
건강하고 튼튼한 DB 어플리케이션을 원하신다면 Insert, Update 쿼리문 작성과 Select 후 TEdit나 TStringGrid 등으로 옮기는 등의 노가다는 필수입니다.
그리고 트랜잭션이 필요한 부분에서만 쿼리문으로 처리하고 즉시 테이블을 닫아주는 것이 좋습니다.
DB 컴포넌트들은 편리하고 빠른만큼 심각한 문제점을 안고 있으며, 하드코딩으로 고생한 만큼 프로그램은 건강해 질 것입니다.
저 역시 초보 시절에 님과 같은 과정을 겪었답니다.
움.. 역시 세상엔 공짜가 없는 것 같네요.
혹시 공부하는 용도로 프로그램을 작성하시더라도 제 말씀을 명심하시고, 어딘가에 납품할 업무용 프로그램이라면 더더욱 님의 방법대로 하면 안될 것입니다.
편한 방법은 개발자의 적입니다. 컴포넌트에 의존하지 않고 항상 하드코딩을 기본으로 생각하는 것이 프로로 가는 지름길입니다.
그리고 웬만하면 델파이는 7 정도로 업글하세요. 4 버전은 버그가 많을겁니다.
그럼 도움되셨기를...