|
DB 작업은 항상 연결이 살아있을 필요가 없습니다.
HTTP 처럼 요청할때 연결만 되면 됩니다.
소켓통신처럼 항상 데이타를 주고 받는 것이 아니니까요
구현하시려는 것이 감시 PC에서 넘어오는 상태를 DB 서버에 저장하는 것이죠?
그럼 이렇게 해보세요
void TfrmMain::Update_Equip(int nEquip, int nState)
{
try
{
adoqry1->Close(); // <<-- 추가
adoqry1->SQL->Clear();
adoqry1->SQL->Text = "장치_현상태 :nEquip, :nState";
adoqry1->Parameters->Items[0]->Value = nEquip;
adoqry1->Parameters->Items[1]->Value = nState;
adoqry1->ExecSQL();
}
catch (Exception &exception)
{
// adoqry1 에 해당하는 커넥션이 ADOConnection1 이라면
ADOConnection1->Connected = false;
}
}
요점은 DB 작업시에 오류가 나면 해당 커넥션을 끊는 것입니다.
다음에 DB 작업을 할때 연결은 다시 됩니다.
연결상태를 검사하는 것은 별 의미가 없습니다.
연결 감시에 대한 훌륭한 기능을 가진 컴포넌트라면 모르겠으나,
보통의 컴포넌트는 상대편 쪽이 부팅이 되었거나 랜선을 빼버렸거나 하는 등의 오류에도 연결여부를
나타내는 속성은 참을 리턴하기때문입니다.
초보자 님이 쓰신 글 :
: // TADOConnection를 2개 사용합니다.
: // adoqry1는 TADOConnection1에 연결했음. (Object Inspector에서)
: // TADOConnection1 의 ConnectionString에 DB, ID, 암호등 설정했음. (테스트 클릭하면 성공)
: // "장치_현상태" 는 프로시져 이름입니다.
:
: // 장비의 현상태를 저장하는 함수
: void TfrmMain::Update_Equip(int nEquip, int nState)
: {
: try
: {
: adoqry1->SQL->Clear();
: adoqry1->SQL->Text = "장치_현상태 :nEquip, :nState";
:
: adoqry1->Parameters->Items[0]->Value = nEquip;
: adoqry1->Parameters->Items[1]->Value = nState;
:
: adoqry1->ExecSQL();
: }
: catch (Exception &exception)
: {
: }
: }
: //---------------------------------------------------------------------------
:
: 위와 같이 데이타 수신시 장비의 상태를 저장합니다.
: 어떤 이유에서 DB서버의 문제가 생겨서 끊어졌다가 다시 살아났을때
: 데이타 수신해도 DB에 저장을 못합니다.
: DB서버가 끊어졌을때 TADOConnection가 끊어져서 그런겁니까?
:
: 위에 함수에서 어떻게 수정을 해야 하는지요?
: 프로시져에 저장하기 전에 DB서버와 연결이 되어 있는지 확인은 어떻게 해야 하는지요?
: 아시는분 부탁합니다.
:
: Timeout 설정하는 방법말구요.
:
: 위에 함수에서 adoqry1->SQL->Clear(); 전에
:
: if( TADOConnection1->State == (TObjectStates() << stClosed) )
: TADOConnection1->Open();
:
: if( TADOConnection2->State == (TObjectStates() << stClosed) )
: TADOConnection2->Open();
:
: 을 넣어봐도 TADOConnection 2개가 모두 연결되어 있는데 디버깅으로 따라가보면
: 1개는 연결이 안되어있는걸고 나옵니다.
: 실행을 계속 하면 프로시져 저장할때 에러가 나구요.
:
: 참고로 OS는 Window 2003 을 사용하고 DB는 SQL200 Server 사용합니다.
: 감시 프로그램과 DB서버는 다른 PC 이구요.
|