QuickQuery - 数据库查询工具






4.74/5 (13投票s)
2004年12月16日
3分钟阅读

117129

3865
一个用于查询所有类型数据库的工具。
引言
QuickQuery是我用C++自己写的第二个程序,只是为了实验。它尝试做一个可以在任何类型的数据库上运行查询的应用程序。此代码使用VC6编写,已在Windows 2000和XP上运行。
背景
我开始尝试制作一些我的公司其他人可以使用 的东西。我时不时还会用到它,但不多。当时,我也在尝试学习DirectX编程,所以你也会在其中看到一些这方面的内容。 :)
使用代码
QuickQuery使用ODBC来运行查询,并使用来自微软“catsets”源代码的CRecordset
派生类。这些集合用于获取数据库中所有表的主键和列。那里有一些我没有实现的功能,但仍然可以使用。
此程序使用CFormView
并在其与CListView
视图之间切换。通过切换到ListView,你可以看到数据库中的所有表
双击一个表将显示该表的列和列类型。
这是通过点击工具栏上的双箭头图标完成的。我使用在我的MSDN中找到的代码来切换应用程序中的视图,该功能名为SwitchView()
CView* CQuickQueryApp::SwitchView(CView* pNewView) { /***************************************************************************** Author: BLACKDICE Purpose: SWITCHES VIEWS BETWEEN A CLISTVIEW OBJECT AND A CFORMVIEW OBJECT-- THEN RETURNS A POINTER TO THE PREVIOUS VIEW (STOLEN FROM MSDN) ******************************************************************************/ CView* pActiveView = ((CFrameWnd*) m_pMainWnd)->GetActiveView(); try { // Exchange view window ID's so RecalcLayout() works. #ifndef _WIN32 UINT temp = ::GetWindowWord(pActiveView->m_hWnd, GWW_ID); ::SetWindowWord(pActiveView->m_hWnd, GWW_ID, ::GetWindowWord(pNewView->m_hWnd, GWW_ID)); ::SetWindowWord(pNewView->m_hWnd, GWW_ID, temp); #else UINT temp = ::GetWindowLong(pActiveView->m_hWnd, GWL_ID); ::SetWindowLong(pActiveView->m_hWnd, GWL_ID, ::GetWindowLong(pNewView->m_hWnd, GWL_ID)); ::SetWindowLong(pNewView->m_hWnd, GWL_ID, temp); #endif pActiveView->ShowWindow(SW_HIDE); pNewView->ShowWindow(SW_SHOW); ((CFrameWnd*) m_pMainWnd)->SetActiveView(pNewView); ((CFrameWnd*) m_pMainWnd)->RecalcLayout(); pNewView->Invalidate(); } catch(CException* err) { pErrObject->HandleError(err," "," "); } catch(...) { AfxMessageBox("Unhandled Error "); } return pActiveView; }
还有一个相当通用的“查找”对话框,允许你在ListView处于活动状态时进行搜索。它允许你按列搜索。虽然它可能应该是一个无模式对话框,但在我制作这个项目的时候,我真的不知道该怎么做。 :)
可以保存查询,以及上次连接的连接字符串,这样当你打开一个查询时,它会连接到正确的数据库。你的上次连接也保存在注册表中,这样当你打开QuickQuery时,它会连接到你在关闭之前打开的上次连接。
void CQuickQueryDoc::Serialize(CArchive& ar) { try { if (ar.IsStoring()) { m_view->UpdateData(); ar<<m_view->m_strQuery<<m_view->m_CurrentSource; } else { //if opening if(!m_view) //if view is not yet showing { ar>>m_docQuery>>m_docSource; m_bSerializing = TRUE; return; } //if view has been initialized already ar>>m_view->m_strQuery>>m_view->m_CurrentSource; AfxGetApp()->WriteProfileString("Database", "LastDatabase",m_view->m_CurrentSource); m_view->UpdateData(FALSE); } } catch(CException* err) { pErrObject->HandleError(err," "," "); } catch(...) { AfxMessageBox("Unhandled Error"); } }
关注点
“关于”对话框有一个简单的PictureBox控件,我用它来显示一个旋转的Direct3D正方形,并将我旧公司的logo纹理映射到该正方形上。这是使用DirectX 8制作的,但我现在有版本9,它编译得很好。也许甚至对话框中涉及的DirectX代码也会对某人有所帮助!(我希望,不是吗?)
正如我所说,这是我的第二个C++项目,不是从教程中出来的,所以请不要太苛刻。 :)
QuickQuery有一个与它相关的上下文相关的帮助文件,我从未完全完成...所以它的一部分有效 - 一部分无效。你可能需要更改帮助文件的路径以用于构建目的。
你可以随意使用这段代码。就像我说的,这是我的第一个项目,直到我在我的一个旧文件夹中看到它时,我才真正忘记了它。如果我要从头开始做一个这样的项目,我将使用ADO,只使用ODBC函数来获取连接字符串,就像我从那时起所做的那样。
已知问题
运行此程序时,在关闭后,我在调试输出中看到一个内存泄漏,但我真的不知道它在哪里(或者不太想调查)。
这个程序比它需要的要大很多,主要是因为位图(我希望如此)。切换视图时有时会发生一个错误。错误处理可以做得更好。
历史
- 发布于2004年12月15日。