您的位置:首页 > 其它

第12课 创建一个ODBC应用

2013-04-18 16:23 295 查看

简 介

本节的目的是演示如何用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应用程序

本实验用的movie.mdb文件下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐