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

📄 childfrm.cpp

📁 Interactive SQL Tool
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		m_nTimerID = SetTimer(1, 1000, NULL);
		m_strExecutionTime = "Exec time: 00:00:00";
		m_wndStatusBar.SetPaneText(m_nExecutionTimePaneNo, m_strExecutionTime);

		m_strStatusText = "Results grid #0 of 0; 0 row(s); 0 col(s)";
		m_wndStatusBar.SetPaneText(2, m_strStatusText);

		m_strMessages.erase();
		m_strProcText.erase();
			
		m_bExecuting = TRUE;
		m_bCanceling = FALSE;
		m_bCanceled = FALSE;
		if(m_bIsTSQLSupported)
			m_comboBox.EnableWindow(FALSE);
		
		long nStart = -1;
		long nEnd = -1;
		m_pQryView->GetRichEditCtrl().GetSel(nStart, nEnd);
		int nBuff = nEnd-nStart;
		CStringEx sSQL;
		if(nBuff == 0)
			m_pQryView->GetRichEditCtrl().GetWindowText(sSQL);
		else if(nBuff > 20000)
		{
			m_pQryView->GetRichEditCtrl().GetWindowText(sSQL);
			sSQL = sSQL.Mid(nStart, nBuff);
		}
		else
			sSQL = m_pQryView->GetRichEditCtrl().GetSelText();

		CDocument* pDoc = GetActiveDocument();
		ASSERT(pDoc != NULL);
		CString sBuff = sSQL;
		CString sTitle = pDoc->GetTitle();
		nBuff = sTitle.Find(_T(" - ("));
		if(nBuff != -1)
			sTitle = sTitle.Left(nBuff);
		sBuff.Replace(_T("\n"), _T(" "));
		sBuff.Replace(_T("\r"), _T(" "));
		if(sBuff.GetLength() > 15)
			sTitle = sTitle + _T(" - (") + sBuff.Left(15) + _T("...)");
		else
			sTitle = sTitle + _T(" - (") + sBuff + _T(")");
		pDoc->SetTitle(sTitle);
		
		if(m_bIsTSQLSupported)
		{
			LPCTSTR lpszHelpText = _T("sp_helptext ");
			int nPos = sSQL.FindNoCase(lpszHelpText);
			if(nPos != -1)
			{
				if(sSQL.Mid(0, _tcslen(lpszHelpText)) == lpszHelpText)
				{
					m_bProcText = TRUE;
					CString sObjName = sSQL.Mid(nPos + _tcslen(lpszHelpText));
					nPos = sObjName.FindOneOf(_T("\n\r\t "));
					if(nPos != -1)				
						sObjName = sObjName.Left(nPos);
					m_pResultView->m_strObjName = sObjName;
					if(!m_strDBMS.CompareNoCase(g_szSQLAnyWhere) ||
						!m_strDBMS.CompareNoCase(g_szASAnyWhere))
					{
						sSQL.Format(_T("SELECT text FROM syscomments where id = object_id('%s') "),
							(LPCTSTR)sObjName);
						sSQL += _T("order by number, colid2, colid");
					}
				}
			}
		}

		if(m_bProcText)
		{
			m_strStatusText = "# of lines of text: 0";
			m_wndStatusBar.SetPaneText(2, m_strStatusText);
		}

		if(!ExecuteSQL(sSQL))
			TRACE(_T("Error executing SQL: %s\n"), (LPCTSTR)sSQL);
	}
}

BOOL CChildFrame::ExecuteSQL(const CStringEx& sSQL)
{
	BOOL bRet = TRUE;

	CloseRecordset();

	try
	{
		m_strSQL = sSQL;
		long lOption = ADODB::adAsyncExecute;
		if(!m_bSupports_adAsyncExecute)
			lOption = ADODB::adCmdText;
		BSTR bstrSQL = m_strSQL.AllocSysString();
		HRESULT hr = m_ptrRecordset->Open(
				bstrSQL,
				m_ptrConnection.GetInterfacePtr(),
				ADODB::adOpenForwardOnly,
				ADODB::adLockReadOnly,
				lOption
				);
		::SysFreeString(bstrSQL);
		if(FAILED(hr))
			_com_issue_error(hr);
	}
	catch(const _com_error& e)
	{
		bRet = FALSE;

		CString sBuff = GetProviderError();
		if(!sBuff.IsEmpty())
			m_strMessages = sBuff;
		else
			m_strMessages = GetComError(e);
	}
	catch(...)
	{
		bRet = FALSE;

		m_strMessages = _T("Errors occurred.");
	}

	if(!bRet)
	{
		if(m_bProcText)
			OnExecProcComplete(true, -1);
		else
			OnExecutionComplete(true, -1);
	}

	return bRet;
}

CQryView* CChildFrame::GetQryView()
{
	return static_cast<CQryView*>(m_wndSplitter.GetPane(0, 0));
}

CResultView* CChildFrame::GetResultView()
{
	CResultView* pResultView = NULL;
	if(m_wndSplitter.m_hWnd != NULL)
		pResultView = static_cast<CResultView*>(m_wndSplitter.GetPane(1, 0));

	return pResultView;
}

void CChildFrame::OnSqlSelectTables() 
{
	CWaitCursor wait;

	CSelectTables dlg;
	if(dlg.DoModal() == IDOK)
	{
		CString sBuff;
		m_pQryView->GetRichEditCtrl().GetWindowText(sBuff);
		int nStart = sBuff.GetLength();
		sBuff += dlg.m_strSQL;
		int nEnd = sBuff.GetLength();
		m_pQryView->GetRichEditCtrl().SetWindowText(sBuff);
		m_pQryView->GetRichEditCtrl().SetSel(nStart+2, nEnd);
		if(dlg.m_bTextOnly && !dlg.m_strType.CompareNoCase(_T("VIEW")) &&
			(m_bIsTSQLSupported || !m_strDBMS.CompareNoCase(g_szOracle) ||
			m_bIsJetDriver))
		{
			m_pResultView->m_strObjName = dlg.m_strObjName;
			m_bProcText = TRUE;
		}
		OnSqlExecute();
	}
}

void CChildFrame::OnUpdateSqlSelectTables(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_lConnectionState == ADODB::adStateOpen && !m_bExecuting);
}

void CChildFrame::OnExceptionClear(const CString& sMsg)
{
	m_pResultView->SetRedraw(FALSE);
	
	ClearGridList();
	
	m_pResultView->GetRichEditCtrl().SetWindowText(sMsg);
	m_pResultView->GetRichEditCtrl().SetSel(0, 0); // Scroll up!
	m_pResultView->SetRedraw(TRUE);
	
	m_nID = 2000;
	m_nIndex = 0;

	m_bExecuteCompleteHandled = FALSE;
	
	m_bCloseMainFrameAfterCancel = FALSE;
	m_bDisconnectAllAfterCancel = FALSE;
	m_bCloseAfterCancel = FALSE;
	
	if(m_nTimerID != 0)
	{
		KillTimer(m_nTimerID);
		m_nTimerID = 0;
	}
	
	m_pResultView->Invalidate();
	m_pResultView->UpdateWindow();
}

BOOL CChildFrame::FillCombo()
{
	BOOL bRet = TRUE;

	CString sMsg;

	m_comboBox.ResetContent();

	try
	{
		ADODB::_RecordsetPtr ptrRS = m_ptrConnection->OpenSchema(
						ADODB::adSchemaCatalogs
						);
		if(ptrRS != NULL)
		{
			if(ptrRS->adoBOF)
			{
				m_comboBox.AddString(g_szNoData);
				m_comboBox.SetCurSel(0);
			}
			else
			{
				CString sDBName;
				while(!ptrRS->adoEOF)
				{
					sDBName = (LPCTSTR)(_bstr_t)ptrRS->Fields->
						GetItem(_variant_t((long)0))->Value;
					if(sDBName.Find(' ') != -1)
						sDBName = "[" + sDBName + "]";
					m_comboBox.AddString(sDBName);
					
					ptrRS->MoveNext();
				}
			}

			m_comboBox.InsertString(m_comboBox.GetCount(), g_szRefresh);
			m_comboBox.EnableWindow();
		}
	}
	catch(const _com_error& e)
	{
		UNUSED_ALWAYS(e);

		sMsg = GetProviderError();
		if(!sMsg.IsEmpty())
			sMsg = "Provider Error";
		else
			sMsg = "_com_error";

		bRet = FALSE;
	}

	if(bRet)
	{
		if(m_comboBox.GetCount())
			if(!SelectDatabase())
				TRACE(_T("Error selecting database context.\n"));
	}
	else
	{
		m_comboBox.AddString(sMsg);
		m_comboBox.SetCurSel(0);
	}

	return bRet;
}

bool CChildFrame::PutInitialCatalog(LPCTSTR lpszInitialCatalog)
{
	bool bRet = true;

	try
	{
		CloseRecordset();

		long lOption = ADODB::adCmdText;
		CString strSQL = "use " + CString(lpszInitialCatalog);
		HRESULT hr = m_ptrRecordset->Open(
				_bstr_t((LPCTSTR)strSQL),
				m_ptrConnection.GetInterfacePtr(),
				ADODB::adOpenForwardOnly,
				ADODB::adLockReadOnly,
				lOption
				);
		if(FAILED(hr))
			_com_issue_error(hr);
		
		CloseRecordset();

		CString sDBName = lpszInitialCatalog;
		CString sBuff = sDBName;
		if(sDBName.Find(_T("[")) != -1)
		{
			sBuff = sDBName.Mid(1);
			int nPos = sBuff.Find(_T("]"));
			if(nPos != -1)
				sBuff = sBuff.Left(nPos);
		}
		ADODB::PropertiesPtr ptrProperties = m_ptrConnection->GetProperties();
		ADODB::PropertyPtr ptrProperty = ptrProperties->GetItem("Current Catalog");
		hr = ptrProperty->put_Value(_variant_t((LPCTSTR)sBuff));
		if(FAILED(hr))
			_com_issue_error(hr);
	}
	catch(const _com_error& e)
	{
		CString sMsg = GetProviderError();
		if(sMsg.IsEmpty())
			sMsg = GetComError(e);

		TRACE(_T("%s\n"), (LPCTSTR)sMsg);

		bRet = false;
	}
	catch(...)
	{
		TRACE(_T("Errors occurred.\n"));

		bRet = false;
	}

	return bRet;
}

void CChildFrame::OnSelChangeDatabase()
{
	CWaitCursor wait;

	CString sBuff, sDBName, sMsg;
	m_comboBox.GetWindowText(sDBName);
	if(!sDBName.CompareNoCase(g_szNoData) ||
		!sDBName.CompareNoCase(g_szNotSupported))
		;
	else if(!sDBName.CompareNoCase(g_szRefresh))
	{
		if(!FillCombo())
			TRACE(_T("Error filling combo.\n"));
	}
	else
	{
		if(sDBName != m_strDBName)
		{
			try
			{
				CloseRecordset();

				long lOption = ADODB::adCmdText;
				CString strSQL = "use " + sDBName;
				HRESULT hr = m_ptrRecordset->Open(
						_bstr_t((LPCTSTR)strSQL),
						m_ptrConnection.GetInterfacePtr(),
						ADODB::adOpenForwardOnly,
						ADODB::adLockReadOnly,
						lOption
						);
				if(FAILED(hr))
					_com_issue_error(hr);

				CloseRecordset();

				sBuff = sDBName;
				if(sDBName.Find(_T("[")) != -1)
				{
					sBuff = sDBName.Mid(1);
					int nPos = sBuff.Find(_T("]"));
					if(nPos != -1)
						sBuff = sBuff.Left(nPos);
				}
				ADODB::PropertiesPtr ptrProperties = m_ptrConnection->GetProperties();
				ADODB::PropertyPtr ptrProperty = ptrProperties->GetItem("Current Catalog");
				hr = ptrProperty->put_Value(_variant_t((LPCTSTR)sBuff));
				if(FAILED(hr))
					_com_issue_error(hr);
				m_comboBox.SelectString(-1, (m_strDBName = (LPCTSTR)sDBName));
			}
			catch(const _com_error& e)
			{
				m_comboBox.SelectString(-1, m_strDBName); // the Old one
				
				sMsg = GetProviderError();
				if(sMsg.IsEmpty())
					sMsg = GetComError(e);

				AfxMessageBox(sMsg);
			}
			catch(...)
			{
				m_comboBox.SelectString(-1, m_strDBName); // the Old one

				AfxMessageBox(_T("Errors occurred."));
			}
		}
	}
}

void CChildFrame::OnSqlSelectProcedures() 
{
	CWaitCursor wait;

	CProceduresDlg dlg;
	if(dlg.DoModal() == IDOK)
	{
		CStringEx sBuff;
		CRichEditCtrl& edit = m_pQryView->GetRichEditCtrl();
		edit.GetWindowText(sBuff);
		sBuff += "\r\n\r\n";
		int nStart = sBuff.GetLength();
		
		CString sSQL;
		if(!m_strDBMS.CompareNoCase(g_szSybaseOpenServer) ||
		   !m_strDBMS.CompareNoCase(g_szMSSQLServer) ||
		   !m_strDBMS.CompareNoCase(g_szMicrosoftSQLServer) ||
		   !m_strDBMS.CompareNoCase(g_szSQLAnyWhere) ||
			!m_strDBMS.CompareNoCase(g_szASAnyWhere)
		   )
			sSQL = "sp_helptext " + dlg.m_strProcedureName;
		else if(!m_strDBMS.CompareNoCase(g_szOracle))
		{
			sSQL = "select TEXT from ALL_SOURCE where type = 'PROCEDURE' and NAME = '";
			sSQL += dlg.m_strProcedureName + "'" ;
		}
		else
			sSQL += dlg.m_strProcedureName + " // Procedure text not supported";

		sBuff += sSQL;
		int nEnd = sBuff.GetLength();
		edit.SetWindowText(sBuff);
		edit.SetSel(nStart, nEnd);
		m_pResultView->m_strObjName = dlg.m_strProcedureName;
		m_bProcText = TRUE;
		OnSqlExecute();
	}
}

void CChildFrame::OnUpdateSqlSelectProcedures(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_lConnectionState == ADODB::adStateOpen && !m_bExecuting);
}

void CChildFrame::OnSqlObjects() 
{
	if(!m_bExecuting)
	{
		CRect rect;
		UINT nIndex = m_wndToolBar.GetToolBarCtrl().CommandToIndex(ID_SQL_OBJECTS);
		m_wndToolBar.GetToolBarCtrl().GetItemRect(nIndex, &rect);
		rect.top = rect.bottom;
		m_wndToolBar.ClientToScreen(&rect.TopLeft());
		
		CMenu menu;
		if(menu.CreatePopupMenu())
		{
			DWORD dwFlags = MF_ENABLED | MF_STRING;
			menu.AppendMenu(dwFlags, ID_SQL_SELECT_TABLES_EX, _T("&Tables...\tF8"));
			menu.AppendMenu(dwFlags, ID_SQL_SELECT_PROCEDURES, _T("&Procedures...\tF9"));
			menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_LEFTBUTTON, rect.left, rect.top, this);
		}
	}
}

void CChildFrame::ClearGridList()
{
	for(POSITION pos = m_GridList.GetHeadPosition(); pos != NULL;)
	{
		CMSFlexGrid* pGridCtrl =  (CMSFlexGrid*)m_GridList.GetNext(pos);
		if(pGridCtrl != NULL)
		{
			pGridCtrl->DestroyWindow();
			delete pGridCtrl;
			pGridCtrl = NULL;
		}
	}
	
	if(!m_GridList.IsEmpty())
	{
		m_GridList.RemoveAll();
		m_nGridCount = 0;
	}

	CResultView* pResultView = GetResultView();
	if(pResultView != NULL)
		pResultView->m_pGridCtrl = NULL;
}

void CChildFrame::OnUpdateIndicatorPaneTextZero(CCmdUI* pCmdUI)
{
	if(!m_bExecuting)
		if(m_strPaneTextZero.IsEmpty())
			m_strPaneTextZero = "Ready";
	pCmdUI->SetText(m_strPaneTextZero);
	pCmdUI->Enable(TRUE);
}

void CChildFrame::OnUpdateIndicatorExecTime(CCmdUI* pCmdUI)
{
	pCmdUI->SetText(m_strExecutionTime);
	pCmdUI->Enable(TRUE);
}

void CChildFrame::OnUpdateIndicatorResultSetInfo(CCmdUI* pCmdUI)
{
	if(m_strStatusText.CompareNoCase(g_szMessages) != 0 &&
		m_strProcText.length())
	{
		m_strStatusText.Format(
				_T("# of lines of text: %d"),
				m_pResultView->GetRichEditCtrl().GetLineCount()
				);
	}
	pCmdUI->SetText(m_strStatusText);
	pCmdUI->Enable(TRUE);
}

void CChildFrame::OnUpdateIndicatorPosition(CCmdUI* pCmdUI)
{
	CView* pView = GetActiveView();
	bool bGrid = false;
	if(pView != NULL && pView->IsKindOf(RUNTIME_CLASS(CResultView)))
	{
		bGrid = m_pResultView->m_pGridCtrl != NULL &&
			::IsWindow(m_pResultView->m_pGridCtrl->m_hWnd) &&
			m_pResultView->m_pGridCtrl->IsWindowVisible();
		if(bGrid)
			m_strLineColInfo.Format(
				_T("Ln %d, Col %d"),
				m_pResultView->m_pGridCtrl->GetRow(),
				m_pResultView->m_pGridCtrl->GetCol()+1
				);
	}
	if(!bGrid)
	{
		CRichEditCtrl* pRichEditCtrl = NULL;
		if(pView != NULL)
		{
			if(pView->IsKindOf(RUNTIME_CLASS(CQryView)))
				pRichEditCtrl = &m_pQryView->GetRichEditCtrl();
			else if(pView->IsKindOf(RUNTIME_CLASS(CResultView)))
				pRichEditCtrl = &m_pResultView->GetRichEditCtrl();
		}
		if(pRichEditCtrl != NULL)
		{
			long lStart = -1;
			long lEnd = -1;
			pRichEditCtrl->GetSel(lStart, lEnd);
			m_strLineColInfo.Format(
				_T("Ln %d, Col %d"),
				pRichEditCtrl->LineFromChar(lStart)+1,
				((lEnd-lStart) >= 0 ? lEnd-pRichEditCtrl->LineIndex(-1) :
					lStart-pRichEditCtrl->LineIndex(-1))+1
				);
		}
	}
	
	pCmdUI->SetText(m_strLineColInfo);
	pCmdUI->Enable(TRUE);
}

void CChildFrame::OnViewPrevResultSet() 
{
	if(m_nIndex > 1)
	{
		POSITION pos = m_GridList.FindIndex(m_nIndex-2);
		DisplayResults((CMSFlexGrid*)m_GridList.GetAt(pos), --m_nIndex);
	}
}

void CChildFrame::OnViewNextResultSet() 
{
	if(m_nIndex > 0 && m_nIndex < m_nGridCount)
	{ 
		POSITION pos = m_GridList.FindIndex(m_nIndex);
		DisplayResults((CMSFlexGrid*)m_GridList.GetAt(pos), ++m_nIndex);
	}
}

void CChildFrame::OnViewFirstResultSet() 
{
	if(m_nIndex > 1)
	{
		m_nIndex = 0;
		POSITION pos = m_GridList.FindIndex(m_nIndex);
		DisplayResults((CMSFlexGrid*)m_GridList.GetAt(pos), ++m_nIndex);
	}
}

void CChildFrame::OnViewLastResultSet() 
{
	if(m_nIndex > 0 && m_nIndex < m_nGridCount)
	{
		m_nIndex = m_nGridCount;
		POSITION pos = m_GridList.FindIndex(--m_nIndex);
		DisplayResults((CMSFlexGrid*)m_GridList.GetAt(pos), ++m_nIndex);
	}
}

void CChildFrame::OnUpdateViewPrevResultSet(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(m_nIndex > 1);
}

void CChildFrame::OnUpdateViewNextResultSet(CCmdUI* pCmdUI) 

⌨️ 快捷键说明

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