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

📄 childfrm.cpp

📁 快速SQL交互工具
💻 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 "MainFrm.h"
#include "font.h"
#include "MySheet.h"
#include "catsets.h"
#include "DrvInfo.h"
#include "ExecuteSQLProc.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_szLoginTimeOut;
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;

// ODBCDriver providers
LPCTSTR g_szODBCJTDriver = _T("ODBCJT32.DLL");

LPCTSTR g_szText = _T("Text");
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_HELP_ODBC_INFO, OnHelpOdbcInfo)
	ON_UPDATE_COMMAND_UI(ID_HELP_ODBC_INFO, OnUpdateHelpOdbcInfo)
	ON_COMMAND(ID_VIEW_MESSAGES, OnViewMessages)
	ON_UPDATE_COMMAND_UI(ID_VIEW_MESSAGES, OnUpdateViewMessages)
	ON_WM_SIZE()
	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("CDatabase::IsOpen = FALSE"),
	m_strLineColInfo(_T("Ln 1, Col 1")),
	m_bIsJetDriver(FALSE),
	m_bIsTSQLSupported(FALSE),
	m_bIsMultiSetSupported(FALSE),
	m_bSQLCancelSupported(FALSE),
	m_bSQLRowCountSupported(FALSE),
	m_bExecuting(FALSE),
	m_bCanceling(FALSE),
	m_bCanceled(FALSE),
	m_nLoginTimeOut(AfxGetApp()->GetProfileInt(g_szConfigure, g_szLoginTimeOut, 0)),
	m_nQueryTimeOut(AfxGetApp()->GetProfileInt(g_szConfigure, g_szQueryTimeOut, 0)),
	m_nCacheSize(AfxGetApp()->GetProfileInt(g_szConfigure, g_szCacheSize, 25)),
	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_pThreadExecuteSQL(NULL),
	m_pThreadCancelSQL(NULL),
	m_pSet(NULL)
{
}

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))
	{
		TRACE0("Failed to create toolbar\n");
		return -1;      // fail to create
	}

	if(!m_wndStatusBar.Create(this) ||
		!m_wndStatusBar.SetIndicators(indicators,
		  sizeof(indicators)/sizeof(UINT)))
	{
		TRACE0("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, 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
	{
		m_dwStart = ::GetTickCount();
		if(m_nLoginTimeOut > 99999 || m_nLoginTimeOut < 0)
			m_nLoginTimeOut = 0;
		m_database.SetLoginTimeout(m_nLoginTimeOut);
		if(lpszConnectString != NULL) 	 // <New query> scenario
		{
			CString sBuff = lpszConnectString;
			if(sBuff.Find(_T("ODBC;")) != -1)
				sBuff = sBuff.Mid(5);
			bRet = m_database.OpenEx(sBuff, CDatabase::noOdbcDialog);
			m_strConnectString = lpszConnectString;
		}
		else
		{
			bRet = m_database.Open(NULL, FALSE, FALSE, _T("ODBC;"), FALSE);
			m_strConnectString = m_database.GetConnect();
		}

		if(!m_strConnectString.IsEmpty())
		{
			pFrame->m_wndStatusBar.SetPaneText(0, _T("Establishing new connection..."));

			m_database.SetQueryTimeout(m_nQueryTimeOut);

			UCHAR buffer[200];
			SWORD cbData;
			::SQLGetInfo(m_database.m_hdbc, SQL_DBMS_NAME, (PTR)buffer, 200, &cbData);
			m_strDBMS = buffer;

			::SQLGetInfo(m_database.m_hdbc, SQL_DATA_SOURCE_NAME, (PTR)buffer, 200, &cbData);
			m_strDataSource = buffer;

			if(m_strDataSource.IsEmpty())
				m_strDataSource = m_strDBMS;

			m_bIsJetDriver = IsODBCJetDriver();
			
			m_bIsTSQLSupported = (!m_strDBMS.CompareNoCase(g_szSQLAnyWhere) ||
				!m_strDBMS.CompareNoCase(g_szASAnyWhere) ||
				!m_strDBMS.CompareNoCase(g_szSybaseOpenServer) ||
				!m_strDBMS.CompareNoCase(g_szMicrosoftSQLServer));

			m_pSet = new CRecordsetEx(&m_database);
			if(m_pSet != NULL)
			{
#ifdef _SET_ROWSET_SIZE
				if(m_nCacheSize > 999999 || m_nCacheSize <= 0)
					m_nCacheSize = 25;
				m_pSet->SetRowsetSize(m_nCacheSize);
#endif
			}

			if(m_bIsTSQLSupported)
			{
				CString sInitialCatalog = lpszInitialCatalog; 
				if(sInitialCatalog.CompareNoCase(g_szNoData) != 0 &&
					lpszInitialCatalog != NULL)
					if(!PutInitialCatalog(lpszInitialCatalog))
						TRACE(_T("Error putting initial catalog.\n"));
				if(!FillCombo())
					TRACE(_T("Error filling combo.\n"));
			}
			else
			{
				m_comboBox.AddString(_T("<Not supported>"));
				m_comboBox.SetCurSel(0);
				m_comboBox.EnableWindow(FALSE);
			}

			m_bIsMultiSetSupported = IsMultiResultSetsSupported();
			m_bSQLCancelSupported = IsSQLCancelSupported();
			m_bSQLRowCountSupported = IsSQLRowCountSupported();
	
			m_strStatusText = "CDatabase::IsOpen == TRUE";
			
			SetExecutionTime();
			
			bRet = TRUE;
		}
	}
	catch(CDBException* e)
	{
	   if(e)
	   {
		   if(!e->m_strError.IsEmpty())
			   sMsg.Format(_T("%s%s"), (LPCTSTR)e->m_strError, (LPCTSTR)e->m_strStateNativeOrigin);
		   else
			   sMsg = e->m_strStateNativeOrigin;

		   e->Delete();
	   }
	   if(sMsg.IsEmpty())
		   sMsg = "Errors occurred.";
	}
	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();
		}
	}

	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_database.IsOpen());
}

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
{
	if(!m_wndSplitter.CreateStatic(this, 2, 1))
	{
		TRACE0("Failed to CreateStaticSplitter\n");
		return FALSE;
	}
 	
	if(!m_wndSplitter.CreateView(0, 0,
		RUNTIME_CLASS(CQryView), CSize(0, 0), pContext))
	{
		TRACE0("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))
	{
		TRACE0("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);

⌨️ 快捷键说明

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