📄 childfrm.cpp
字号:
// 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 + -