简 介
本节的目的是演示如何用UltimateGrid开发全功能的ODBC(MFC)应用程序。
开放式数据库互连(ODBC)接口允许应用程序使用结构化查询语句(SQL)作为访问数据的标准去访问数据库管理系统(DBMS)中的数据。该接口允许最大程度的互通性 — 一个应用程序可以访问不同的数据库管理系统。
第1步– 创建一个新的MFC项目
使用MFC应用程序向导创建一个新的MFC项目,项目命名为ODBC20。
图 4.28 – MFC应用程序向导
在MFC应用程序向导中,第一步选择基于对话框的选项。如下图。
图 4.29 – MFC应用程序向导的第一步
选择【Finish】,由MFC应用程序向导为你完成创建项目框架文件。
添加Ultimate Grid项目文件
添加所有在源代码目录"Source"和"Include"中的*.h文件和*.cpp文件到项目中
同样也包括mycug.cpp和mycug.h文件。
另外四个文件必须被添加到项目中。这些文件在软件工具包中("DataSources\ODBC")。这四个文件是ugodbc.cpp, ugodbc.h, ugrecset.cpp和ugrecset.h,负责在应用程序中扩展ODBC功能。
第2步– 创建一个ODBC接口
点击资源文件标签页。Visual C++会有如下图所示的显示。
点击IDD_ODBC20_DIALOG。修改界面类似于下图。
图 4.30 – 一个空白的对话框界面
参阅下表给所有的控件分配正确的名字。
控件 | 控件名 |
编辑框 | IDC_SQL_EDIT |
组合框 | IDC_CONNECT |
静态文本 | IDC_GRID |
SQL按钮 | IDSQL |
Browse按钮 | IDBROWSE |
Close按钮 | IDCLOSE |
第3步– 包含必要的头文件
在创建对话框界面后,添加必要的头文件。
在ODBC20.cpp和ODBC20Dlg.cpp文件中包含mycug.h文件。
// ODBC20.cpp : 定义应用程序的类行为
#include "stdafx.h"
#include "mycug.h" // 这个新加的头文件
#include "ODBC20.h"
#include "ODBC20Dlg.h"
添加< afxdb.h>到STDAFX.H文件中
包含afxdb.h头文件到STDAFX.h
#define VC_EXTRALEAN // Excluderarely-used stuff from Windows headers
#include <afxwin.h> // MFC coreand standard components
#include <afxdb.h> // 添加的头文件
#include <afxext.h>
第4步– 创建必要的成员变量
首先被创建的对象是网格对象。打开ODBC20Dlg.h文件,添加下面两句代码。一个是创建网格对象,另一句是创建一个整形的索引变量。
class CODBC20Dlg : public CDialog
{
// Construction
public:
CODBC20Dlg(CWnd* pParent = NULL);
MyCug m_grid ; // 新的网格对象
int m_index ; // 新的成员变量
// Dialog Data
接下来,我们必须使成员变量与界面上的控件相关联。使用类向导来完成。与变量相关联的控件名是:IDC_SQL_EDIT和IDC_CONNECT。启动类向导选择IDC_SQL_EDIT。参考下图。
图 4.31 – 类向导
选择Add variable按钮。 这将产生下面这个对话框
图 4.32 – 添加成员变量对话框
这个变量命名为m_sql2。记住Category选项选’control’,点击“OK”生成了一个成员变量。
对于IDC_CONNECT控件也重复这一步,命名为m_control2。
此时类向导生成了两个成员变量。请看下列代码。
public:
CODBC20Dlg(CWnd* pParent = NULL); //standard constructor
MyCug m_grid ;
// Dialog Data
//{{AFX_DATA(CODBC20Dlg)
enum { IDD = IDD_ODBC20_DIALOG };
CcomboBox m_control2; // 新的成员变量
CEdit m_sql2; // 新的成员变量
//}}AFX_DATA
两个新的成员变量就是类向导所创建的。
第5步– 创建一个ODBC对象
最后必须要被创建的对象是ODBC对象,这个对象可以被建在MyCug类中。
选择类视图,高亮MyCug类,然后右键点击,选择"Add Member Variable",这样将显示下图
图 4.33 – 添加一个成员变量的屏幕
在Variable Type框中输入'CUGODBCDatasource'。在Variable Declaration框中输入'm_odbc'。点击OK。
第6步– 在对话框界面上建立网格
在CODBC20Dlg::OnInitDialog()内添加后面这行代码, "m_grid.AttachGrid(this,IDC_GRID)"。
BOOL CODBC20Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_grid.AttachGrid(this,IDC_GRID);
// Add "About..." menu item to system menu.
在MyCug::OnSetup()内添加下列两行代码。
void MyCug::OnSetup()
{
SetNumberRows(10);
SetNumberCols(10);
}
编译执行项目。
执行你的项目屏幕将显示下面图示的界面。
图 4.34 - Ultimate Grid在对话框界面上
现在程序还没有功能,但下面章节将对所有控件进行编码。
第7步– 添加功能控件
选择类向导,创建两个CODBC20Dlg类的成员函数。给三个按钮(Browse, SQL和Close)赋予功能。打开类向导,选择IDBROWSE。请参阅下图。
图 4.35 – 类向导
消息提示创建一个新的函数,选择“是”。对于IDSQL和IDCLOSE重复此步骤。
此时,创建了CODBCDlg::OnBrowse(), CODBCDlg::OnSQL()和CODBCDlg::OnClose这三个函数。
在为这两个函数编写代码之前,我们必须添加一行代码到CODBC10Dlg::OnInitDialog()中,这行代码负责创建数据源索引,为网格提供数据。
添加的代码为后面粗体部分。
BOOL CODBC10Dlg::OnInitDialog(){
CDialog::OnInitDialog();
m_grid.AttachGrid(this, IDC_GRID) ;
m_index =m_grid.AddDataSource(&m_grid.m_odbc);
// Add "About..." menu item tosystem menu.
第8步– 编码OnBrowse
添加下列代码行到函数中。
void CODBC20Dlg::OnBrowse()
{
//声明所有的变量
int ans;
CString sqlString, connectstr;
SQLDatasourceInfo *dbI;
char buf[256] ;
ans = m_grid.m_odbc.Browse(this->m_hWnd);
if (ans == UG_SUCCESS)
{
m_sql2.SetWindowText(*m_grid.m_odbc.GetConnectString());
MessageBox("You have successfully connected to the database" , "OK", MB_OK);
int i = 0;
while(dbI = m_grid.m_odbc.GetTableInfo(i++))
{
sqlString.Format("Select * FROM[%s]", dbI->tableName);
m_control2.AddString(sqlString);
}
}
//进入编辑部分选择第一项
m_control2.GetLBText(0, buf);
m_control2.SetWindowText(buf);
}
第9步– 编码OnSQL()
添加下列代码行到这个函数。
void CODBC20Dlg::OnSql()
{
//声明所有变量
int ret = 1;
CString db;
CString sql;
m_grid.SetDefDataSource(0);
m_grid.SetTH_Height(0);
m_grid.SetSH_Width(0);
m_grid.RedrawAll();
m_sql2.GetWindowText(db);
m_control2.GetWindowText(sql);
if (db == "")
MessageBox("Invalid connect string");
else if (sql == "")
MessageBox("Invalid SQL string");
else
{
AfxGetApp()->BeginWaitCursor();
ret = m_grid.m_odbc.OpenSQL(db, sql);
AfxGetApp()->EndWaitCursor();
}
//用SQL查询的结果设置网格
if (ret == UG_SUCCESS)
{
m_grid.EnableUpdate(FALSE);
m_grid.SetTH_Height(20);
m_grid.SetSH_Width(30);
m_grid.SetDefDataSource(m_index);
m_grid.SetGridUsingDataSource(m_index);
m_grid.BestFit(0, m_grid.GetNumberCols() - 1, 0, UG_BESTFIT_TOPHEADINGS);
for (int i = 0; i < m_grid.GetNumberCols(); i++)
if (m_grid.GetColWidth(i) > 300)
{
m_grid.SetColWidth(i, 300);
}
m_grid.SetSH_Width(31);
m_grid.GotoRow(0);
m_grid.EnableUpdate(TRUE);
}
}
第10步– 编码OnClose()
添加下列代码行到这个函数。
voidCODBC20Dlg::OnClose()
{
OnOK() ;
}
第11步– 编码OnHitBottom()
你必须添加一些代码到本消息函数内。如果忽略了这一步,那么将只有一个记录。因此你必须通知网格不断的增加记录直到所有的记录已经被添加。将下面的代码添加到OnHitBottom函数内。
void MyCug::OnHitBottom(longnumrows, long rowspast, long rowsfound)
{
// used by the datasources
if ( rowsfound > 0 )
{
SetNumberRows( numrows + rowsfound, FALSE );
}
}
注意:请确保SetNumberRows函数的第二个参数值是 'FALSE'。如果你不这样,网格将保持重绘,并会导致一个无限循环。
测试您的全功能ODBC应用程序
请确保你的机器上有ODBC驱动程序功能。
编译执行你的新应用程序
当你的应用程序运行后,选择“浏览”按钮这将产生以下的画面。
图 4.36 - Select Data Source对话框
现在,选择所需的数据源。在我的例子中选择了"scott"数据源。
选择OK 。屏幕会出现一个关于这个数据源的小对话框。这将类似于下图。
图 4.37 – ODBC登录对话框
单击OK。应用程序会出现数据库连接字符串。单击Browse 。完成的应用程序见下图。
图 4.38 – Ultimate Grid的ODBC应用程序