C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[64654] DataSet 사용후 DB서버 접속 해제가 안되어 누적 되면서 서버가 다운됩니다 ㅜㅜ
너부리 [bossam1029] 1855 읽음    2011-06-20 18:44
DB서버에 일정 시간마다 접속해 데이터를 조회, 추가하는 작업을 진행중입니다.
TADOCommand으로 추가하면 멀쩡하구요
그런데   TADODataSet으로 조회 하구 나면 서버 해제가 안되요 ㅜㅜ
이거 버그인가요? 아니면 제가 잘못 쓰는건가요?
아니면 다른 컴포넌트로 조회 가능한게 있나요?
알려주시면 감사하겠습니다~


#include <vcl.h>
#pragma hdrstop

#include "MainForm.h"
#include <process.h>

#define WAIT_TIME   5000
#define MSG_TITLE   "Share"
#define DB_SERVER   "Provider=PostgreSQL OLE DB Provider;Password=1111;User ID=postgres;Data Source=www.string.co.kr;Location=MINI;Extended Properties="" "
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainFrm *MainFrm;


//---------------------------------------------------------------------------
__fastcall TMainFrm::TMainFrm(TComponent* Owner) : TForm(Owner)
{
    m_bActive       = TRUE;
    m_TimerEvent    = CreateEvent(NULL, FALSE, FALSE, NULL);
}
//---------------------------------------------------------------------------
void __fastcall TMainFrm::FormDestroy(TObject *Sender)
{
    m_bActive = FALSE;
    CloseHandle(m_TimerEvent);
}
//---------------------------------------------------------------------------
unsigned int __stdcall TMainFrm::DbConnectThread(void *pParam)
{
    TMainFrm *Dlg = (TMainFrm *)pParam;

    CoInitialize(NULL);

    while(Dlg->m_bActive)   {
        if(WaitForSingleObject(Dlg->m_TimerEvent, WAIT_TIME) == WAIT_TIMEOUT) {
            Dlg->ConnDbServer();
            Dlg->Work();
            Dlg->CloseDbServer();
        }
    }

    CoUninitialize();
    return 0;
}


void __fastcall TMainFrm::FormCreate(TObject *Sender)
{
    _beginthreadex(NULL, 0, DbConnectThread, (void*)this, 0, NULL);
}
//---------------------------------------------------------------------------


char __fastcall TMainFrm::ConnDbServer(void)
{
    try {
        m_Conn->ConnectionTimeout   = 20;
        m_Conn->ConnectionString    = DB_SERVER;
        m_Conn->CursorLocation      = clUseServer;
        m_Conn->LoginPrompt         = FALSE;
        m_Conn->Mode                = cmReadWrite;

        m_Conn->Open();
    }
    catch(...)  {
        LogWrite("DB연결 실패 !!");
        return  FALSE;
    }

     LogWrite("DB연결 성공 ~~");
     return TRUE;
}


void __fastcall TMainFrm::LogWrite(AnsiString Msg)
{
    AnsiString  Str;

    Str.sprintf("[%s %s] %s", Now().FormatString("YYYY-MM-DD").c_str(), Now().FormatString("HH:MM:SS").c_str(), Msg.c_str());
    Log->Lines->Add(Str);
}

void __fastcall TMainFrm::CloseDbServer(void)
{
    if(m_Conn->Connected)   m_Conn->Close();

    m_Conn->Connected = false;
    LogWrite("DB해제 성공 ~~");
}

BOOL __fastcall TMainFrm::QueryProcessing(AnsiString Sql, TADODataSet *RecordSet)
{
    try{
        if(RecordSet->Active)   RecordSet->Close();

        RecordSet->Connection       = m_Conn;
        RecordSet->Prepared         = true;
        RecordSet->CursorType       = ctStatic;
       /RecordSet->LockType         = ltOptimistic;
        RecordSet->CommandTimeout   = 120;
        RecordSet->CommandType      = cmdText;
        RecordSet->CommandText      = Sql;
        RecordSet->Open();
    }
    catch(EDatabaseError &e){   MessageBox(NULL, e.Message.c_str()  , MSG_TITLE, MB_ICONWARNING); return FALSE;   }
    catch(Exception &e)     {   MessageBox(NULL, e.Message.c_str()  , MSG_TITLE, MB_ICONWARNING); return FALSE;   }

    return TRUE;
}
//[*]-------------------------------------------------------------------------------------------------------------------------------------------------------------------[*]
BOOL __fastcall TMainFrm::CommandProcessing(AnsiString Sql, TADOCommand *Command)
{
    try{
        Command->Connection     = m_Conn;
        Command->Prepared       = TRUE;
        Command->CommandType    = cmdText;
        Command->CommandText    = Sql;
        Command->Execute();
    }
    catch(EDatabaseError &e){   MessageBox(NULL, e.Message.c_str()  , MSG_TITLE, MB_ICONWARNING); return FALSE;  }
    catch(Exception &e)     {   MessageBox(NULL, e.Message.c_str()  , MSG_TITLE, MB_ICONWARNING); return FALSE;  }

    return TRUE;
}

void __fastcall TMainFrm::Work(void)
{
    AnsiString Sql;
   
    TADODataSet *Set  = new TADODataSet(this);
    TADOCommand *Comm = new TADOCommand(this);


    Sql = "select user_id from user_info ";
    if(!QueryProcessing(Sql, Set))  return;
    LogWrite("select");
   
    Set->Close();


    Sql.sprintf("insert into user_info (user_id, user_pw) values ('%s', '1111') ", Now().FormatString("HH:MM:SS").c_str());
    if(!CommandProcessing(Sql, Comm))   return;
    LogWrite("insert");



    delete  Set;
    delete  Comm;

}

+ -

관련 글 리스트
64654 DataSet 사용후 DB서버 접속 해제가 안되어 누적 되면서 서버가 다운됩니다 ㅜㅜ 너부리 1855 2011/06/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.