|
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;
}
|