65.9K
CodeProject 正在变化。 阅读更多。
Home

QuickQuery - 数据库查询工具

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.74/5 (13投票s)

2004年12月16日

3分钟阅读

viewsIcon

117129

downloadIcon

3865

一个用于查询所有类型数据库的工具。

QuickQuery

引言

QuickQuery是我用C++自己写的第二个程序,只是为了实验。它尝试做一个可以在任何类型的数据库上运行查询的应用程序。此代码使用VC6编写,已在Windows 2000和XP上运行。

背景

我开始尝试制作一些我的公司其他人可以使用 的东西。我时不时还会用到它,但不多。当时,我也在尝试学习DirectX编程,所以你也会在其中看到一些这方面的内容。 :)

使用代码

QuickQuery使用ODBC来运行查询,并使用来自微软“catsets”源代码的CRecordset派生类。这些集合用于获取数据库中所有表的主键和列。那里有一些我没有实现的功能,但仍然可以使用。

此程序使用CFormView并在其与CListView视图之间切换。通过切换到ListView,你可以看到数据库中的所有表

Table View

双击一个表将显示该表的列和列类型。

Column View

这是通过点击工具栏上的双箭头图标完成的。我使用在我的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处于活动状态时进行搜索。它允许你按列搜索。虽然它可能应该是一个无模式对话框,但在我制作这个项目的时候,我真的不知道该怎么做。 :)

Find Dialog

可以保存查询,以及上次连接的连接字符串,这样当你打开一个查询时,它会连接到正确的数据库。你的上次连接也保存在注册表中,这样当你打开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代码也会对某人有所帮助!(我希望,不是吗?)

About QuickQuery

正如我所说,这是我的第二个C++项目,不是从教程中出来的,所以请不要太苛刻。 :)

QuickQuery有一个与它相关的上下文相关的帮助文件,我从未完全完成...所以它的一部分有效 - 一部分无效。你可能需要更改帮助文件的路径以用于构建目的。

你可以随意使用这段代码。就像我说的,这是我的第一个项目,直到我在我的一个旧文件夹中看到它时,我才真正忘记了它。如果我要从头开始做一个这样的项目,我将使用ADO,只使用ODBC函数来获取连接字符串,就像我从那时起所做的那样。

已知问题

运行此程序时,在关闭后,我在调试输出中看到一个内存泄漏,但我真的不知道它在哪里(或者不太想调查)。

这个程序比它需要的要大很多,主要是因为位图(我希望如此)。切换视图时有时会发生一个错误。错误处理可以做得更好。

历史

  • 发布于2004年12月15日。
© . All rights reserved.