자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi ADOQuery Insert 후 Refresh 할 수 있나요??
2019.05.20 15:25
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하세요
또 질문 드리게 됐습니다...
XE5 사용중 이구요....
ADOConnection
ADOQuery
DataSource
위 3개는 DataModule에 있고
사용 으로 메인폼에 DBgrid 로 보여지고 서브폼은 ShowModal로 띄우고 여기에 있는 데이타를 쿼리문을 만들어 메인폼에 보내고 메인폼에서
DBModule.ADOQuery.Close;
DBModule.ADOQuery.SQL.Clear;
DBModule.ADOQuery.SQL.Text := Value;
DBModule.ADOQuery.ExecSQL;
실행 하고.... DBGrid 내용을 Refresh 하기 위하여
DBModule.ADOQuery.Close;
DBModule.ADOQuery.SQL.Clear;
DBModule.ADOQuery.SQL.Text := 'SELECT * FROM Table';
DBModule.ADOQuery.Open;
했습니다.
한번은 잘 되는데 여러번 실행 하면 Access violation 에러가 납니다...
문제는 쿼리문을 함수에서 받지 않고 내부에서 직접 작성하여
DBModule.ADOQuery.SQL.Text := 'INSERT INTO Table ( ) Values ( )'; 하고
refresh 실행 하면 잘 작동 하는데...
쿼리문을 서브폼에서 받아서 실행 하면 refresh 쪽에서 에러가 나는 것 같은데 정확하게 모르겠습니다...
' Access violation at address 0040564B in Module 'Project3.exe'. Read of address 00000000. ' 요렇게 뜨는데....
제 생각은 refresh 할 때 에러가 나는 것 같습니다.. Refresh 하기 위해 찾아 보니...
Dataset.refresh, Query.refresh 여러가지가 있는거 같습니다.
따라 해보면 Cannot perform this operation on a closed dataset.
이렇게 뜨네요
이것땜에 또 몇일 보내내요....에휴....지나가다 보시면 정보좀 부탁드립니다.
감사합니다...
------------------------------------------------------------------------------------------------------------------------------
계속 하다보니 문제는 서브폼이 모달 폼으로 띄워져서 종료 할때 문제가 발생하는 것 같습니다...
메인폼에서
fmAdd := TfmAdd.Create(Nil);
fmAdd.ShowModal;
이렇게 띄우고 종료 할때 서브폼에서 쿼리문 보내주고
ModalResult := mrOk;
이렇게 되어 있습니다.
서브폼 Close에서는
Action := caFree;
fmAdd := nil;
이렇게 해놨는데....
무슨 문제가 있나용?
댓글 6
-
동그랑땡88
2019.05.20 17:29
-
초보델팡이
2019.05.20 17:40
네 답변 감사합니다...
Insert 문을 DBModule.ADOQuery.SQL.Text := 'INSERT INTO Table ( ) Values ( )';직접 입력 하면 잘 됩니다..
refresh ( select 문을 사용 ) 하면 잘 됩니다...
하지만 서브폼에서 Insert SQL문을 받아 메인에서 실행 후 위와 같이 refresh ( select 문을 사용 ) 하면
' Access violation at address 0040564B in Module 'Project3.exe'. Read of address 00000000. ' 요렇게 뜨더라구용...ㅜㅜ
-
동그랑땡88
2019.05.21 11:25
대충 추측된 업무를 작성해본다면
메인폼 버튼클릭 이벤트에 아래와 같은 흐름으로 작성되겠네요...
fmAdd := TfmAdd.Create(Nil);
fmAdd.ShowModal;
if fmAdd.ModalResult = mrOK then
begin
DBModule.ADOQuery.Close;
DBModule.ADOQuery.SQL.Clear;
DBModule.ADOQuery.SQL.Text := 'SELECT * FROM Table';
DBModule.ADOQuery.Open;
end;
--------------------------------------------------------------------------
서브폼 저장버튼? 이벤트에 아래와 같은 흐름으로 작성되겠네요...
try
DBModule.ADOQuery.SQL.Text := 'INSERT INTO Table ( ) Values ( )';
ModalResult := mrOk;
except
ShowMessage('저장시 에러발생');
end;
-
초보델팡이
2019.05.21 12:33
답변 감사드립니다!!
해결 된것 같습니다만...궁금하것이
메인폼에서
fmAdd.showmodal 하고
fmAdd.free하면 에러 발생 하더라고요....이것 없애고...
fmAdd.formclose 부분에서
Action := cafree;
fmAdd := nil;
요거 두개 없앴더니 잘 동작하는데......
이렇게 하면 메모리 해제하는 부분이 없는데 상관 없나요?
-
동그랑땡88
2019.05.21 14:43
메모리 해제가 안되는 거죠....
서브폼 자체에서 하는 것이면
Action := cafree; -> 이건 기존처럼 OnClose
fmAdd := nil; -> 이건 서브폼의 OnDestroy 에서 보통 하구요
위의것을 안하고 호출하는 곳에서 하면
fmAdd.showmodal
.....
fmAdd.Free
fmAdd := nil;
뭐 둘중 한가지 방법으로 하죠...
둘다하면 나중에 실행되는 곳에서 이미 해제 했는데 참조를 시도하므로 AV 에러 나겠죠...
-
초보델팡이
2019.05.21 18:44
네 감사합니다!!!!
Delphi ADOQuery Insert 후 Refresh 할 수 있나요??
2019.05.20 15:25
본 게시판은 개발자들이 자유롭게 질문과 답변을 공유하는 게시판입니다.
* 따라서 최대한 정중하게 질문을 올려 주세요.
* 질문을 상세히 작성해 주실 수록 좋은 답변이 올라 옵니다.
* 다른 분들도 참고할 수 있도록 결과 댓글 필수(또는 감사 댓글)
(결과 댓글을 달지 않는 경우 다음 질문에 대한 답변이 달리지 않는 불이익이 있을 수 있습니다.)
-----------------------------------------------------------------------------------------------
안녕하세요
또 질문 드리게 됐습니다...
XE5 사용중 이구요....
ADOConnection
ADOQuery
DataSource
위 3개는 DataModule에 있고
사용 으로 메인폼에 DBgrid 로 보여지고 서브폼은 ShowModal로 띄우고 여기에 있는 데이타를 쿼리문을 만들어 메인폼에 보내고 메인폼에서
DBModule.ADOQuery.Close;
DBModule.ADOQuery.SQL.Clear;
DBModule.ADOQuery.SQL.Text := Value;
DBModule.ADOQuery.ExecSQL;
실행 하고.... DBGrid 내용을 Refresh 하기 위하여
DBModule.ADOQuery.Close;
DBModule.ADOQuery.SQL.Clear;
DBModule.ADOQuery.SQL.Text := 'SELECT * FROM Table';
DBModule.ADOQuery.Open;
했습니다.
한번은 잘 되는데 여러번 실행 하면 Access violation 에러가 납니다...
문제는 쿼리문을 함수에서 받지 않고 내부에서 직접 작성하여
DBModule.ADOQuery.SQL.Text := 'INSERT INTO Table ( ) Values ( )'; 하고
refresh 실행 하면 잘 작동 하는데...
쿼리문을 서브폼에서 받아서 실행 하면 refresh 쪽에서 에러가 나는 것 같은데 정확하게 모르겠습니다...
' Access violation at address 0040564B in Module 'Project3.exe'. Read of address 00000000. ' 요렇게 뜨는데....
제 생각은 refresh 할 때 에러가 나는 것 같습니다.. Refresh 하기 위해 찾아 보니...
Dataset.refresh, Query.refresh 여러가지가 있는거 같습니다.
따라 해보면 Cannot perform this operation on a closed dataset.
이렇게 뜨네요
이것땜에 또 몇일 보내내요....에휴....지나가다 보시면 정보좀 부탁드립니다.
감사합니다...
------------------------------------------------------------------------------------------------------------------------------
계속 하다보니 문제는 서브폼이 모달 폼으로 띄워져서 종료 할때 문제가 발생하는 것 같습니다...
메인폼에서
fmAdd := TfmAdd.Create(Nil);
fmAdd.ShowModal;
이렇게 띄우고 종료 할때 서브폼에서 쿼리문 보내주고
ModalResult := mrOk;
이렇게 되어 있습니다.
서브폼 Close에서는
Action := caFree;
fmAdd := nil;
이렇게 해놨는데....
무슨 문제가 있나용?
댓글 6
-
동그랑땡88
2019.05.20 17:29
-
초보델팡이
2019.05.20 17:40
네 답변 감사합니다...
Insert 문을 DBModule.ADOQuery.SQL.Text := 'INSERT INTO Table ( ) Values ( )';직접 입력 하면 잘 됩니다..
refresh ( select 문을 사용 ) 하면 잘 됩니다...
하지만 서브폼에서 Insert SQL문을 받아 메인에서 실행 후 위와 같이 refresh ( select 문을 사용 ) 하면
' Access violation at address 0040564B in Module 'Project3.exe'. Read of address 00000000. ' 요렇게 뜨더라구용...ㅜㅜ
-
동그랑땡88
2019.05.21 11:25
대충 추측된 업무를 작성해본다면
메인폼 버튼클릭 이벤트에 아래와 같은 흐름으로 작성되겠네요...
fmAdd := TfmAdd.Create(Nil);
fmAdd.ShowModal;
if fmAdd.ModalResult = mrOK then
begin
DBModule.ADOQuery.Close;
DBModule.ADOQuery.SQL.Clear;
DBModule.ADOQuery.SQL.Text := 'SELECT * FROM Table';
DBModule.ADOQuery.Open;
end;
--------------------------------------------------------------------------
서브폼 저장버튼? 이벤트에 아래와 같은 흐름으로 작성되겠네요...
try
DBModule.ADOQuery.SQL.Text := 'INSERT INTO Table ( ) Values ( )';
ModalResult := mrOk;
except
ShowMessage('저장시 에러발생');
end;
-
초보델팡이
2019.05.21 12:33
답변 감사드립니다!!
해결 된것 같습니다만...궁금하것이
메인폼에서
fmAdd.showmodal 하고
fmAdd.free하면 에러 발생 하더라고요....이것 없애고...
fmAdd.formclose 부분에서
Action := cafree;
fmAdd := nil;
요거 두개 없앴더니 잘 동작하는데......
이렇게 하면 메모리 해제하는 부분이 없는데 상관 없나요?
-
동그랑땡88
2019.05.21 14:43
메모리 해제가 안되는 거죠....
서브폼 자체에서 하는 것이면
Action := cafree; -> 이건 기존처럼 OnClose
fmAdd := nil; -> 이건 서브폼의 OnDestroy 에서 보통 하구요
위의것을 안하고 호출하는 곳에서 하면
fmAdd.showmodal
.....
fmAdd.Free
fmAdd := nil;
뭐 둘중 한가지 방법으로 하죠...
둘다하면 나중에 실행되는 곳에서 이미 해제 했는데 참조를 시도하므로 AV 에러 나겠죠...
-
초보델팡이
2019.05.21 18:44
네 감사합니다!!!!
Refresh 대신 그냥 아래를 다시 실행하세요...
DBModule.ADOQuery.Close;
DBModule.ADOQuery.SQL.Clear;
DBModule.ADOQuery.SQL.Text := 'SELECT * FROM Table';
DBModule.ADOQuery.Open;
ADOQuery 로 select 문도 사용하고, insert 문도 사용하니
insert 문을 실행했을때는 이미 DataSet 이라 볼수 없으므로
ADOQuery.Refresh 가 안먹죠...