📄 qrytoolconnectionevents.cpp
字号:
// QryToolConnectionEvents.cpp: implementation of the CQryToolConnectionEvents class.
//
#include "stdafx.h"
#include "QryToolConnectionEvents.h"
#include "MainFrm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
long CQryToolConnectionEvents::m_lRow = 0;
//////////////////////////////////////////////////////////////////////
// CQryToolConnectionEvents
CQryToolConnectionEvents::CQryToolConnectionEvents(CChildFrame* pChildFrame)
{
m_pChildFrame = pChildFrame;
}
CQryToolConnectionEvents::~CQryToolConnectionEvents()
{
m_pChildFrame = NULL;
}
//ExecuteComplete事件响应函数
STDMETHODIMP CQryToolConnectionEvents::ExecuteComplete(
LONG RecordsAffected,
ADOError* pError,
EventStatusEnum* adStatus,
_ADOCommand* pCommand,
_ADORecordset* pRecordset,
_ADOConnection* pConnection)
{
OutputDebugString(_T("ExecuteComplete event fired.\n"));
UNUSED_ALWAYS(adStatus);
UNUSED_ALWAYS(pError);
UNUSED_ALWAYS(pCommand);
UNUSED_ALWAYS(pConnection);
HRESULT hr = S_OK;
if(m_pChildFrame != NULL &&
AfxIsValidAddress(m_pChildFrame, sizeof(m_pChildFrame)) != NULL &&
!m_pChildFrame->m_strSQL.IsEmpty() && !m_pChildFrame->m_bCanceled &&
m_pChildFrame->m_bExecuting)
{
m_pChildFrame->m_ThreadParam.m_strSQL = m_pChildFrame->m_strSQL;
m_pChildFrame->m_strSQL.Empty();
m_pChildFrame->m_ThreadParam.m_pFrame = m_pChildFrame;
ASSERT(m_pChildFrame != NULL);
m_pChildFrame->m_ThreadParam.m_ptrRS = pRecordset;
if(m_pChildFrame->m_bProcText)
{
m_pChildFrame->m_pThreadExecuteSQL = AfxBeginThread(
ExecuteSQLProcProc, &m_pChildFrame->m_ThreadParam,
m_pChildFrame->m_nThreadPriority
);
}
else
{
m_pChildFrame->m_ThreadParam.m_pGridCtrl = NULL;
m_pChildFrame->m_ThreadParam.m_ptrGridCtrl = NULL;
m_pChildFrame->m_ThreadParam.m_vRowsAffected = RecordsAffected;
m_pChildFrame->m_pThreadExecuteSQL = AfxBeginThread(
ExecuteSQLProc, &m_pChildFrame->m_ThreadParam,
m_pChildFrame->m_nThreadPriority
);
}
ASSERT(m_pChildFrame->m_pThreadExecuteSQL != NULL);
m_pChildFrame->m_pThreadExecuteSQL->m_pMainWnd = m_pChildFrame;
}
return hr;
}
//
UINT ExecuteSQLProc(LPVOID lpVoid)
{
ThreadParam* pTP = (ThreadParam*)lpVoid;
CChildFrame* pChildFrame = pTP->m_pFrame;
ASSERT(pChildFrame != NULL);
ASSERT(pTP != NULL);
ASSERT(!pTP->m_strSQL.IsEmpty());
HRESULT hr = S_OK;
bool bCaughtException = false;
try
{
hr = CQryToolConnectionEvents::PopulateGrid(pTP);
if(FAILED(hr))
_com_issue_error(hr);
}
catch(const _com_error& e)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
CString sBuff = pChildFrame->GetProviderError();
if(!sBuff.IsEmpty())
pChildFrame->m_strMessages += sBuff;
else
pChildFrame->m_strMessages += pChildFrame->GetComError(e);
}
}
catch(CMemoryException* e)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += _T("Out-of-Memory.");
}
if(e)
e->Delete();
}
catch(COleException* e)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(e)
{
TCHAR szMsg[255];
e->GetErrorMessage(szMsg, 255);
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += szMsg;
}
}
if(e)
e->Delete();
}
catch(COleDispatchException* e)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(e)
{
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += e->m_strDescription;
}
}
if(e)
e->Delete();
}
catch(LPCTSTR e)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += e;
}
}
catch(...)
{
if(!pChildFrame->m_bCanceled)
{
bCaughtException = true;
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += _T("Errors occurred.");
}
}
try
{
if(pChildFrame->m_bIsTSQLSupported && !pChildFrame->m_bCanceled)
{
pChildFrame->m_strSQL.Empty();
if(pTP->m_strSQL.FindNoCase(_T("USE ")) != -1)
{
if(!pChildFrame->SelectDataBaseEx())
TRACE(_T("Error selecting database context.\n"));
}
}
if(pChildFrame->m_bCanceled)
{
if(CQryToolConnectionEvents::m_lRow > 1)
CQryToolConnectionEvents::m_lRow = --CQryToolConnectionEvents::m_lRow;
if(pTP->m_pGridCtrl != NULL)
::SendMessage(
pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
CQryToolConnectionEvents::m_lRow, pChildFrame->m_bCanceled
);
}
if(pTP->m_ptrGridCtrl != NULL)
{
pTP->m_ptrGridCtrl.Release();
pTP->m_ptrGridCtrl = NULL;
}
}
catch(...)
{
TRACE(_T("Errors occurred.\n"));
}
try
{
::PostMessage(
pChildFrame->m_hWnd, WM_EXECUTION_COMPLETE, bCaughtException, -1
);
}
catch(...)
{
TRACE(_T("Errors occurred.\n"));
}
return 0;
}
CStringEx m_strSQL;
CChildFrame* m_pFrame;
CMSFlexGrid* m_pGridCtrl;
MSFlexGridLib::IMSFlexGridPtr m_ptrGridCtrl;
ADODB::_RecordsetPtr m_ptrRS;
HRESULT CQryToolConnectionEvents::PopulateGrid(ThreadParam* pTP)
{
//ThreadParam结构中包含记录集和显示控件等信息
CChildFrame* pChildFrame = pTP->m_pFrame;
ASSERT(pChildFrame != NULL);
//读入记录结果集
ADODB::_RecordsetPtr ptrRS = pTP->m_ptrRS;
long lState = ADODB::adStateClosed;
long nTotalCols = 0;
long nCols = 0;
long lRow = 0;
long lType = ADODB::adEmpty;
//记录集属性字段
ADODB::FieldsPtr ptrFields = NULL;
ADODB::FieldPtr ptrField = NULL;
//最大记录集数
long lMaxRows = 700;
_variant_t vCol((long)-1);
_variant_t vRowsAffected = pTP->m_vRowsAffected;
_bstr_t bstrBuff;
CString sBuff;
HRESULT hr = S_OK;
//只要查询没有被结束(m_bCanceled=1表结束),且游标
//没有指向行集末尾;则查询一直继续。参看while语句。
do
{
hr = ptrRS->get_State(&lState);
if(FAILED(hr))
_com_issue_error(hr);
if(lState == ADODB::adStateClosed)
{
if((long)vRowsAffected != -1 && !pChildFrame->m_bExecuteCompleteHandled)
{
sBuff.Format(_T("(%d row(s) affected)"), (long)vRowsAffected);
if(pChildFrame->m_strMessages.length())
pChildFrame->m_strMessages += _T("\n\n");
pChildFrame->m_strMessages += sBuff;
}
}
else if(lState == ADODB::adStateOpen &&
lState != ADODB::adStateClosed)
{
ptrFields = ptrRS->Fields;
nCols = ptrFields->Count;
lRow = 0;
if(!pChildFrame->m_bCanceled && nCols)
{
nTotalCols += nCols;
//向父窗口(CChildFrame)发送WM_GET_GRID_CTRL消息,要求
//系统创建CMSFlexGri控件实例。
if(::SendMessage(pChildFrame->m_hWnd, WM_GET_GRID_CTRL,
nCols, 0L) == -1)
throw _T("Failed to create grid control.");
//设置CMSFlexGri控件标头信息
if(!pChildFrame->m_bCanceled)
CQryToolConnectionEvents::SetGridHeaderInfo(
pTP->m_ptrGridCtrl, ptrFields, nCols);
//以下程序快向控件中添加查询到的记录结果
if(!pChildFrame->m_bCanceled && ptrRS->State == ADODB::adStateOpen &&
!ptrRS->adoBOF)
{
//向父窗口(CChildFrame)发送WM_SET_GRID_ROWS消息,要求
//系统为CMSFlexGrid分配存储空间
if(::SendMessage(pChildFrame->m_hWnd, WM_SET_GRID_ROWS,
lMaxRows, 0L) == -1)
throw _T("Unable to Allocate Memory for FlexGrid.");
if(pChildFrame->m_bCanceled)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -