⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 childfrm.cpp

📁 Interactive SQL Tool
💻 CPP
📖 第 1 页 / 共 4 页
字号:
// ChildFrm.cpp : implementation of the CChildFrame class
//

#include "stdafx.h"
#include "QryTool.h"
#include "ChildFrm.h"
#include "QryToolDoc.h"
#include "SelectTables.h"
#include "ProceduresDlg.h"
#include "DumpProviderProperties.h"
#include "MainFrm.h"
#include "QryToolConnectionEvents.h"
#include "font.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern CQryToolApp theApp;

// Database combo
LPCTSTR g_szNoData = _T("<No Data>");
LPCTSTR g_szRefresh = _T("<Refresh>");
LPCTSTR g_szNotSupported = _T("<Not supported>");

// Configure
extern LPCTSTR g_szConfigure;
extern LPCTSTR g_szQueryTimeOut;
extern LPCTSTR g_szCacheSize;
extern LPCTSTR g_szThreadPriority;
extern LPCTSTR g_szTimeCritical;
extern LPCTSTR g_szHighest;
extern LPCTSTR g_szAboveNormal;
extern LPCTSTR g_szNormal;
extern LPCTSTR g_szBelowNormal;
extern LPCTSTR g_szLowest;

// OLEDB providers
LPCTSTR g_szODBCJTDriver = _T("ODBCJT32.DLL");
LPCTSTR g_szMSOLEDBProviderForODBCDrivers = _T("MSDASQL.DLL");
LPCTSTR g_szMSADIPP = _T("MSDAIPP.DLL");
LPCTSTR g_szMSOLEDBProForIP = _T("Microsoft OLE DB Provider for Internet Publishing");

// Databases
LPCTSTR g_szMSJet = _T("MS Jet");
LPCTSTR g_szMSSQLServer = _T("MS SQL Server");
LPCTSTR g_szMicrosoftSQLServer = _T("Microsoft SQL Server");
LPCTSTR g_szSQLAnyWhere =_T("Sybase SQL Anywhere");
LPCTSTR g_szASAnyWhere =_T("Adaptive Server Anywhere");
LPCTSTR g_szSybaseOpenServer = _T("SQL Server");
LPCTSTR g_szOracle = _T("Oracle");
LPCTSTR g_szVisualFoxPro = _T("Visual FoxPro");

// New connections
extern LPCTSTR g_szUntitled;
extern int g_nUntitledBump;

// License key
extern LPCTSTR g_lpszProgID;

// Font properties
LPCTSTR g_szQueryFont = _T("Query\\Font");
LPCTSTR g_szResultFont = _T("Result\\Font");
LPCTSTR g_szGridFont = _T("Grid\\Font");
// For QryView and ResultView
LPCTSTR g_szHeight = _T("Height");
LPCTSTR g_szWeight = _T("Weight");
LPCTSTR g_szItalic = _T("Italic");
LPCTSTR g_szUnderline = _T("Underline");
LPCTSTR g_szPitchAndFamily = _T("PitchAndFamily");
LPCTSTR g_szCharSet = _T("CharSet");
LPCTSTR g_szFaceName = _T("FaceName");
LPCTSTR g_szSystem = _T("System");
// For grid
LPCTSTR g_szBold = _T("Bold");
LPCTSTR g_szSize = _T("Size");

// Messages
LPCTSTR g_szMessages = _T("Messages");
/////////////////////////////////////////////////////////////////////////////
// CChildFrame

IMPLEMENT_DYNCREATE(CChildFrame, CMDIChildWnd)

BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
	//{{AFX_MSG_MAP(CChildFrame)
	ON_WM_CREATE()
	ON_WM_CLOSE()
	ON_COMMAND(ID_QUERY_NEW, OnQueryNew)
	ON_UPDATE_COMMAND_UI(ID_QUERY_NEW, OnUpdateQueryNew)
	ON_COMMAND(ID_VIEW_PREV_RESULT_SET, OnViewPrevResultSet)
	ON_UPDATE_COMMAND_UI(ID_VIEW_PREV_RESULT_SET, OnUpdateViewPrevResultSet)
	ON_COMMAND(ID_VIEW_NEXT_RESULT_SET, OnViewNextResultSet)
	ON_UPDATE_COMMAND_UI(ID_VIEW_NEXT_RESULT_SET, OnUpdateViewNextResultSet)
	ON_COMMAND(ID_VIEW_LAST_RESULT_SET, OnViewLastResultSet)
	ON_UPDATE_COMMAND_UI(ID_VIEW_LAST_RESULT_SET, OnUpdateViewLastResultSet)
	ON_COMMAND(ID_VIEW_FIRST_RESULT_SET, OnViewFirstResultSet)
	ON_UPDATE_COMMAND_UI(ID_VIEW_FIRST_RESULT_SET, OnUpdateViewFirstResultSet)
	ON_COMMAND(ID_SQL_SELECT_PROCEDURES, OnSqlSelectProcedures)
	ON_UPDATE_COMMAND_UI(ID_SQL_SELECT_PROCEDURES, OnUpdateSqlSelectProcedures)
	ON_COMMAND(ID_SQL_OBJECTS, OnSqlObjects)
	ON_UPDATE_COMMAND_UI(ID_SQL_OBJECTS, OnUpdateSqlObjects)
	ON_COMMAND(ID_SQL_EXECUTE, OnSqlExecute)
	ON_UPDATE_COMMAND_UI(ID_SQL_EXECUTE, OnUpdateSqlExecute)
	ON_COMMAND(ID_SQL_CANCEL, OnSqlCancel)
	ON_UPDATE_COMMAND_UI(ID_SQL_CANCEL, OnUpdateSqlCancel)
	ON_CBN_SELCHANGE(IDW_COMBO, OnSelChangeDatabase)
	ON_COMMAND(ID_SQL_SELECT_TABLES_EX, OnSqlSelectTables)
	ON_UPDATE_COMMAND_UI(ID_SQL_SELECT_TABLES_EX, OnUpdateSqlSelectTables)
	ON_UPDATE_COMMAND_UI(IDW_COMBO, OnUpdateCombo)
	ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateFileMruFile1)
	ON_WM_TIMER()
	ON_COMMAND(ID_VIEW_MESSAGES, OnViewMessages)
	ON_UPDATE_COMMAND_UI(ID_VIEW_MESSAGES, OnUpdateViewMessages)
	ON_WM_SIZE()
	ON_COMMAND(ID_DUMP_PROVIDER_PROPERTIES_EX, OnDumpProviderPropertiesEx)
	ON_UPDATE_COMMAND_UI(ID_DUMP_PROVIDER_PROPERTIES_EX, OnUpdateDumpProviderPropertiesEx)
	ON_COMMAND(ID_SET_DBCOMBO_FOCUS, OnSetDbcomboFocus)
	//}}AFX_MSG_MAP
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_PANE_TEXT_ZERO, OnUpdateIndicatorPaneTextZero)
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_EXECUTION_TIME, OnUpdateIndicatorExecTime)
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_RESULT_SET, OnUpdateIndicatorResultSetInfo)
	ON_UPDATE_COMMAND_UI(ID_INDICATOR_POSITION, OnUpdateIndicatorPosition)
	ON_MESSAGE(WM_EXECUTION_COMPLETE, OnExecutionComplete)
	ON_MESSAGE(WM_EXEC_PROC_COMPLETE, OnExecProcComplete)
	ON_MESSAGE(WM_CANCEL_COMPLETE, OnCancelComplete)
	ON_MESSAGE(WM_GET_GRID_CTRL, OnGetGridCtrl)
	ON_MESSAGE(WM_SET_GRID_ROWS, OnSetGridRows)
END_MESSAGE_MAP()

static UINT indicators[] =
{
	ID_INDICATOR_PANE_TEXT_ZERO,
	ID_INDICATOR_EXECUTION_TIME,
	ID_INDICATOR_RESULT_SET,
	ID_INDICATOR_POSITION
};

/////////////////////////////////////////////////////////////////////////////
// CChildFrame construction/destruction

CChildFrame::CChildFrame() :
	m_bOKToSize(false),
	m_nExecutionTimePaneNo(1),
	m_nResultSetPaneNo(2),
	m_nLineColPaneNo(3),
	m_nID(2000),
	m_nIndex(0),
	m_nGridCount(0),
	m_strPaneTextZero("Ready"),
	m_strExecutionTime("Exec time: 00:00:00"),
	m_strStatusText("_ConnectionPtr::State == adStateClosed"),
	m_strLineColInfo(_T("Ln 1, Col 1")),
	m_bIsJetDriver(FALSE),
	m_bIsTSQLSupported(FALSE),
	m_bIsMultiSetSupported(FALSE),
	m_bExecuting(FALSE),
	m_bCanceling(FALSE),
	m_bCanceled(FALSE),
	m_ptrConnection(NULL),
	m_ptrCommand(NULL),
	m_ptrRecordset(NULL),
	m_lConnectionState(ADODB::adStateClosed),
	m_nQueryTimeOut(AfxGetApp()->GetProfileInt(g_szConfigure, g_szQueryTimeOut, 0)),
	m_nCacheSize(AfxGetApp()->GetProfileInt(g_szConfigure, g_szCacheSize, 100)),
	m_nThreadPriority(GetThreadPriority(AfxGetApp()->GetProfileString(g_szConfigure,
		g_szThreadPriority))),
	m_bExecuteCompleteHandled(FALSE),
	m_pQryView(NULL),
	m_pResultView(NULL),
	m_nTimerID(0),
	m_bCloseMainFrameAfterCancel(FALSE),
	m_bDisconnectAllAfterCancel(FALSE),
	m_bCloseAfterCancel(FALSE),
	m_bProcText(FALSE),
	m_pCE(NULL),
	m_dwCnEvents(-1),
	m_pThreadExecuteSQL(NULL),
	m_pThreadCancelSQL(NULL),
	m_bSupports_adAsyncExecute(TRUE)
{
}

CChildFrame::~CChildFrame()
{
	CWaitCursor wait;

	CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
	if(pFrame != NULL)
	{
		pFrame->m_wndMDIClient.Invalidate();
		pFrame->m_wndMDIClient.UpdateWindow();
		pFrame->UpdateWindow();
	
		std::list<CChildFrame*>::iterator i = 
			std::find(pFrame->m_listChildFrame.begin(),
				pFrame->m_listChildFrame.end(), this);
		if(i != pFrame->m_listChildFrame.end())
			pFrame->m_listChildFrame.erase(i);

		if(pFrame->m_listChildFrame.size() == 0)
			if(::IsWindow(pFrame->m_dlgGoTo.m_hWnd))
				pFrame->m_dlgGoTo.DestroyWindow();
	}
}

/////////////////////////////////////////////////////////////////////////////
// CChildFrame diagnostics

#ifdef _DEBUG
void CChildFrame::AssertValid() const
{
	CMDIChildWnd::AssertValid();
}

void CChildFrame::Dump(CDumpContext& dc) const
{
	CMDIChildWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CChildFrame message handlers

int CChildFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if(CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	if(!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
		| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
		!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
	{
		TRACE(_T("Failed to create toolbar\n"));
		return -1;      // fail to create
	}

	if(!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE(_T("Failed to create status bar\n"));
		return -1;      // fail to create
	}

	int nIndex = 0;
	UINT nID = ID_SEPARATOR;
	UINT nStyle = -1;
	int nWidth = -1;
	m_wndStatusBar.GetPaneInfo(nIndex, nID, nStyle, nWidth);
	m_wndStatusBar.SetPaneInfo(nIndex, nID, SBPS_NORMAL | SBPS_STRETCH, nWidth);
	m_wndStatusBar.SetPaneInfo(
		m_nExecutionTimePaneNo, ID_INDICATOR_EXECUTION_TIME, SBPS_NORMAL, 100
		);
	m_wndStatusBar.SetPaneInfo(
		m_nResultSetPaneNo, ID_INDICATOR_RESULT_SET, SBPS_NORMAL, 230
		);
	m_wndStatusBar.SetPaneInfo(
		m_nLineColPaneNo, ID_INDICATOR_POSITION, SBPS_NORMAL, 100
		);
	
	CRect rect;
	nIndex = m_wndToolBar.GetToolBarCtrl().CommandToIndex(IDW_COMBO);
	m_wndToolBar.SetButtonInfo(nIndex, IDW_COMBO, TBBS_SEPARATOR, 205);
	m_wndToolBar.GetToolBarCtrl().GetItemRect(nIndex, &rect);
	rect.top = 3;
	rect.bottom = rect.top + 250 /*drop height*/;
	if(!m_comboBox.Create(CBS_DROPDOWNLIST | CBS_SORT | WS_VISIBLE |
		WS_TABSTOP | WS_VSCROLL, rect, &m_wndToolBar, IDW_COMBO))
	{
		TRACE(_T("Failed to create combo-box\n"));
		return FALSE;
	}
	LOGFONT logFont;
	memset(&logFont, 0, sizeof(logFont));
	logFont.lfHeight = -11;
	logFont.lfWeight = 400;
	_tcscpy(logFont.lfFaceName, _T("MS Sans Serif"));
	if(!m_font.CreateFontIndirect(&logFont))
		TRACE(_T("Could Not create font for Combo\n"));
	else
		m_comboBox.SetFont(&m_font);
	m_comboBox.EnableWindow(FALSE);

	// TODO: Remove this if you don't want tool tips or a resizeable toolbar
	m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
		CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

	GetProfileFont(
		g_szGridFont,
		&m_GridFont.m_lf,
		true, 
		&m_GridFont.m_bIsBold,
		&m_GridFont.m_nSize
		);
	m_GridFont.m_strFaceName = m_GridFont.m_lf.lfFaceName;
	
	return 0;
}

BOOL CChildFrame::Connect(LPCTSTR lpszConnectString, const bool& bRetry,
	LPCTSTR lpszInitialCatalog)
{
	CWaitCursor wait;

	BOOL bRet = FALSE;
	CString sMsg;
	CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
	ASSERT(pFrame != NULL);
	pFrame->m_wndStatusBar.SetPaneText(0, _T("Establishing new connection..."));
	try
	{
		HRESULT hr = S_OK;
		if(lpszConnectString != NULL) 	 // <New query> scenario
		{
			hr = m_ptrConnection.CreateInstance(__uuidof(ADODB::Connection));
			if(FAILED(hr))
				_com_issue_error(hr);
			
			m_strConnectString = lpszConnectString;
		}
		else
		{
			MSDASC::IDataSourceLocatorPtr ptrDataSourceWnd = NULL;
			hr = ptrDataSourceWnd.CreateInstance(__uuidof(MSDASC::DataLinks));
			if(FAILED(hr))
				_com_issue_error(hr);
        
			hr = ptrDataSourceWnd->put_hWnd((long)this->m_hWnd);
			if(FAILED(hr))
				_com_issue_error(hr);
                
			if(!bRetry)
			{
				IDispatchPtr ptrDispatch = NULL;
				hr = ptrDataSourceWnd->PromptNew(&ptrDispatch);
				if(FAILED(hr))
					_com_issue_error(hr);
        		if(ptrDispatch != NULL)
				{
					m_ptrConnection = ptrDispatch;
					BSTR bstrConnectString = m_ptrConnection->ConnectionString;
					USES_CONVERSION;
					m_strConnectString = W2CT(bstrConnectString);
					TRACE(_T("Connect String: %s\n"), (LPCTSTR)m_strConnectString);
				}
			}
			else
			{
				IDispatch* pDispatch = NULL;
				hr = m_ptrConnection.QueryInterface(IID_IDispatch, &pDispatch);
				if(FAILED(hr))
					_com_issue_error(hr);

				short bSuccess = 0;
				hr = ptrDataSourceWnd->PromptEdit(&pDispatch, &bSuccess);
				if(FAILED(hr))
				{
					if(ptrDataSourceWnd != NULL)
					{
						ptrDataSourceWnd.Release();
						ptrDataSourceWnd = NULL;
					}
					if(pDispatch != NULL)
					{
						pDispatch->Release();
						pDispatch = NULL;
					}
					
					_com_issue_error(hr);
				}

				if(!bSuccess) // User clicked on <Cancel>
					m_strConnectString.Empty();
				else
				{
					BSTR bstrConnectString = m_ptrConnection->ConnectionString;
					USES_CONVERSION;
					m_strConnectString = W2CT(bstrConnectString);
					TRACE(_T("Connect String: %s\n"), (LPCTSTR)m_strConnectString);
				}

				if(pDispatch != NULL)
				{
					pDispatch->Release();
					pDispatch = NULL;
				}
			}

			if(ptrDataSourceWnd != NULL)
			{
				ptrDataSourceWnd.Release();
				ptrDataSourceWnd = NULL;
			}
		}

		if(!m_strConnectString.IsEmpty())
		{
			CWaitCursor wait;

			pFrame->m_wndStatusBar.SetPaneText(0, _T("Establishing new connection..."));

			m_dwStart = ::GetTickCount();
			
			hr = SetConnectionEvents();
			if(FAILED(hr))
				_com_issue_error(hr);

			hr = m_ptrConnection->Open(
					_bstr_t((LPCTSTR)m_strConnectString),
					_bstr_t(L""),
					_bstr_t(L""),
					ADODB::adConnectUnspecified
					);
			if(FAILED(hr))
				_com_issue_error(hr);
			
			m_lConnectionState = m_ptrConnection->State;
			
			hr = m_ptrCommand.CreateInstance(__uuidof(ADODB::Command));
			if(FAILED(hr))
				_com_issue_error(hr);
			
			try
			{
				m_ptrCommand->ActiveConnection = m_ptrConnection;
			}
			catch(...)
			{
			}
			
			try
			{
				if(m_nQueryTimeOut > 99999 || m_nQueryTimeOut < 0)
					m_nQueryTimeOut = 0;
				m_ptrConnection->CommandTimeout = m_nQueryTimeOut;
			}
			catch(...)
			{
			}

			hr = m_ptrRecordset.CreateInstance(__uuidof(ADODB::Recordset));
			if(FAILED(hr))
				_com_issue_error(hr);

			try
			{
				if(m_nCacheSize > 999999 || m_nCacheSize <= 0)
					m_nCacheSize = 100;
				m_ptrRecordset->CacheSize = m_nCacheSize;
			}
			catch(...)
			{
			}
						
			if(!SetProperties(lpszInitialCatalog))
				TRACE(_T("Error setting properties.\n"));

			if(m_strDataSource.IsEmpty())
				m_strDataSource = "<Unknown>";
			
			m_strStatusText = "_ConnectionPtr::State == adStateOpen";
			
			SetExecutionTime();
			
			bRet = TRUE;
		}
	}
	catch(const _com_error& e)
	{
		sMsg = GetProviderError();
		if(sMsg.IsEmpty())
			sMsg = GetComError(e);
	}
	catch(COleException* e)
	{
		if(e)
		{
			TCHAR szMsg[255];
			e->GetErrorMessage(szMsg, 255);
			sMsg = szMsg;
			e->Delete();
		}
	}
	catch(COleDispatchException* e)
	{
		if(e)
		{
			sMsg = e->m_strDescription;
			e->Delete();
		}
	}
	catch(CMemoryException* e)
	{
		sMsg = "Out-of-Memory.";
		if(e)
			e->Delete();
	}
	catch(CException* e)
	{
		if(e)
		{
			TCHAR szMsg[255];
			e->GetErrorMessage(szMsg, 255);
			sMsg = szMsg;
			e->Delete();
		}
	}
	catch(...)
	{	
		sMsg = "Errors occurred.";
	}

	if(!bRet && !sMsg.IsEmpty())
	{
		if(AfxMessageBox(sMsg, MB_RETRYCANCEL | MB_ICONQUESTION) == IDRETRY)
		{
			m_strConnectString.Empty();
			bRet = Connect(NULL, true);
		}
	}

	pFrame->m_wndStatusBar.SetPaneText(0, _T(""));

	return bRet;
}

void CChildFrame::OnQueryNew() 
{
	try
	{
		CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
		ASSERT(pFrame != NULL);
		CString sInitialCatalog;
		m_comboBox.GetWindowText(sInitialCatalog);
		pFrame->ConnectEx(m_strConnectString, NULL, sInitialCatalog);
	}
	catch(...)
	{
		AfxMessageBox(_T("Errors occurred."));
	}
}

void CChildFrame::OnUpdateQueryNew(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_lConnectionState == ADODB::adStateOpen);
}

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	if(!m_wndSplitter.CreateStatic(this, 2, 1))
	{
		TRACE(_T("Failed to CreateStaticSplitter\n"));
		return FALSE;
	}
 	
	if(!m_wndSplitter.CreateView(0, 0,
		RUNTIME_CLASS(CQryView), CSize(0, 0), pContext))
	{
		TRACE(_T("Failed to create third pane\n"));
		return FALSE;
	}

	// CResultView must be the last in the creation process.
	// There can be only one CRichEditDoc per CRichEditView
	if(!m_wndSplitter.CreateView(1, 0,
		RUNTIME_CLASS(CResultView), CSize(0, 0), pContext))
	{
		TRACE(_T("Failed to create first pane\n"));
		return FALSE;
	}

	m_pQryView = GetQryView();
	ASSERT(m_pQryView != NULL);
	
	m_pResultView = GetResultView();
	ASSERT(m_pResultView != NULL);

	m_bOKToSize = true;

	return TRUE;
}

void CChildFrame::OnSize(UINT nType, int cx, int cy) 
{
	if(m_bOKToSize)
	{
		CRect rect;
		GetClientRect(&rect);
		m_wndSplitter.SetRowInfo(0, rect.Height()/2, 0);
	}

	CMDIChildWnd::OnSize(nType, cx, cy);
}

void CChildFrame::OnSqlExecute() 
{
	if(!m_bExecuting)
	{
		m_strPaneTextZero = _T("Executing query batch...");
		m_wndStatusBar.SetPaneText(0, m_strPaneTextZero);

		OnExceptionClear(CString(""));

		m_dwStart = ::GetTickCount();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -