지금까지 로컬용으로 프로그램을 개발하다가 다중 사용자용 DB 프로그램을
개발할려고 합니다. DB는 MSSQL 7.0과 델파이5.0 에 ADO를 사용해서 쓸려고
하는데 델파이와 MSSQL 연결을 시켰는데 다중 사용자로 처리를 할려니까
어떻게 구현을 해야할지 방법을 모르겠네요. DB그리드상에서 자료를 처리하는데
동시에 같은 레코드의 자료를 A라는 사용자는 삭제할수도 있고 B라는 사용자는
수정할 수도 있지 않습니까? 먼저 A라는 사용자가 삭제를 해 버리면
B라는 사용자는 수정할 수 없는데 어떻게 구현을 해야 에러 없이 자료를 삭제,수정이
가능할까요? 대충 귀뜸이라도 이렇게 구현하고 조언을 부탁 드립니다.
CursorType, LockType을요..
정답은 가까운 곳에 있습니다.
다중사용자프로그램에서, 에레메세지 표시는 필수죠.
(아래처럼 POST시 메세지 표시만 해주시면 됩니다.)
(ADO는 MDAC가 꼭 핸들링 하기 때문에, 미리 쿼리를 돌려서, 레코드가
있는지 체크한 다음
해야 할겁니다. )
select*from .. where () 로 해서 존재하는 레코드인지 체크.
Try POSTorINSERT 처리
Except "이미 삭제된 레코드이거나.." 메세지 표시
아래는 IBExpress 사용시인데, ADOExpress 사용시에도 거의 같습니다.
procedure TForm1.IBQuery1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
showmessage('알립니다. : 쓰기에러입니다. 확인을 누른후 재시도 해주세요'+#13+
'수정중이었다면'+#13+
'[다른사용자가 같은 레코드를 편집] 또는'+#13+
'[이미 삭제된 레코드]'+#13+#13+
'추가중이었다면'+#13+'[키 값 중복 Key Violation]');
//위에러처리도 DBGrid에서 화살표키로 저장한경우엔, 소용이없다
//"deadlock.." 메세지 박스가 위메세지표시한다음, 뜨기때문에..
//(되긴된다. "deadlock.." 박스하나 더뜬다뿐.. 다른문제는 없으므로..)
//프로그램이 종료되는건아니다.
//그리드직접편집 버튼 하나 만들자!!.
//화살표키는 (자기만저장)이다. 다른사용자한테 보여지지 않는다.
//그래도 db에 직접쓰긴쓴다.
//저장버튼(Commit)은 다른사용자에게 보여지게하기위해서다.(전역저장)
//위 에러처리(안내)는 DBGrid에서 직접편집안하고 별도입력폼과 코딩으로 할때는
//Commit한 후에(다른사용자 편집한걸 가져오므로), 저장(쓰기)하면 에러안난다.
//이걸로 임시로 에러 막았는데,
// 화면에 계속 뿌릴려면, 타이머 사용해야 한다.
//
//윌리에서 발생했던 공유문제 총정리.
//Post시 에러나면 EIBInterbase Error message를 가로챈다.
//Post시 에러는 Edit (수정)에러 밖에 없다.=== 같은 레코드를 수정할 경우
// === 다른 레코드 수정시는 에러안남
// Insert (삽입)는 에러안남
// Delete (삭제)는 삭제하기전에 Commit한다음 삭제하면 됨.
// (아니다. 삭제한다음 Commit => 다른컴에서 삭제한 레코드를
// 읽어오지 않은 상태에서 어떤 처리를 하면 에러난다.. <==
// <==이것은 무조건 삽입,삭제시에 레코드셋을 새로 읽어오도록
// <==수정시는 아래 showmessage
// 즉 커미트 +(ibquery.close)+ ibquery.open하도록 <== ()는 생략가능(커미트하면 자동적으로 close되므로)
// 수정,삽입시 공통으로 발생할수 있는 에러는 바로 KEY VIOLATION
// showmessage('프로그래머 권원재');
end;
강은영 wrote:
> 지금까지 로컬용으로 프로그램을 개발하다가 다중 사용자용 DB 프로그램을
>
> 개발할려고 합니다. DB는 MSSQL 7.0과 델파이5.0 에 ADO를 사용해서 쓸려고
>
> 하는데 델파이와 MSSQL 연결을 시켰는데 다중 사용자로 처리를 할려니까
>
> 어떻게 구현을 해야할지 방법을 모르겠네요. DB그리드상에서 자료를 처리하는데
>
> 동시에 같은 레코드의 자료를 A라는 사용자는 삭제할수도 있고 B라는 사용자는
>
> 수정할 수도 있지 않습니까? 먼저 A라는 사용자가 삭제를 해 버리면
>
> B라는 사용자는 수정할 수 없는데 어떻게 구현을 해야 에러 없이 자료를 삭제,수정이
>
> 가능할까요? 대충 귀뜸이라도 이렇게 구현하고 조언을 부탁 드립니다.