瑞星卡卡安全论坛技术交流区系统软件 【推荐】SQL 21 日自学通-2

12345   5  /  5  页   跳转

【推荐】SQL 21 日自学通-2

第14 天动态使用SQL
目标
今天这一课的目的是把我们到现在为止所学习的付诸于应用在今天的内容中我们将
学习如何在实际编程中使用SQL 我们主要讨论在WINDOWS 下的编程环境但是编程
的原理也适用于其它的软件平台在今天之中我们将学习
l 不同的商业产品— — Personal Oracle 7 开放数据库联接ODBC InterBase
ISQL MicroSoft Visual C++ 和BORLAND DELPHI 中SQL 的差别
l 如何正确的为使用SQL 来设置你的环境
l 如何使用ORACLE 7 MicroSoft Query 和InterBase ISQL 来创建数据库
l 如何在VISUAL C++和DELPHI 中使用SQL
快速入门
这一部分将主要介绍一些在WINDOWS 操作系统下的商业产品以及它们是如何与SQL
产生联系的所涉及的基本原理如果在产品中没有进行特别的说明那么也可以在其它的软
件平台中使用
ODBC
ODBC 是WINDOWS 操作系统的一种底层技术它可以让基本WINDOWS 的程序通
过驱动程序来访问数据库与每种数据库系统所提供的用户界面不同你可以用它来将你
所要完成的工作完成的非常好你可以通过你所选择的驱动来联接进行数据库ODBC 的
概念与WINDOWS 的打印机驱动的概念非常相似— — 它可以让你写的程序与具体的打印机
无关与此相对应的是在DOS 下你不得不自己来考虑和编写相关的打印机驱动程序所以
你可以将你更多的精力来投入到你的程序上而不是写打印驱动
ODBC 将这一思想应用到了数据库上你可以在WINDOWS 3.1 3.11 和95 的控制面
板中找到它在WINDOWS NT 中它有着自己的程序组
SQL 21 日自学通(V1.0) 翻译人笨猪
285
我们将在今天创建数据库的时候讨论更多的关于ODBC 的细节
Personal Oracle 7
Personal Oracle 7 是近来在PC 数据库市场上最流行的数据库系统不必安装Personal
Oracle 7 的全部程序我们在前几天中所使用的例子只是用了ORACLE DATABASE
MANGER 和SQL*PLUS 3.3 SQL*PLUS 的如下图所示
InterBase SQL ISQL
一些其它的例子所使用的工具是Borland’s ISQL 它在本质上与ORACLE7 是相同的
只不过ORACLE 7 是字符型界面而ISQL 则更具有WINDOWS 的风格
在下图中给出了ISQL 的界面你可以在上边的编辑框中输入SQL 语句结果将会出
现在下边的编辑框中按向上和向下按钮则可以翻阅你在一次会话中的所有查询
SQL 21 日自学通(V1.0) 翻译人笨猪
286
Visual C++
关于Visual C++的书有几十本在本书的例子中我们使用的是它的1.52 版我们所使
用的过程可以应用于它的32 位版的C++ 2.0 在这里使用它是应用它有一个ODBC 的简单
界面它不但具有编译联接到数据库的能力而且如果你想使用其它的编译器的话那么
这里将会是一个非常好的出发点
Visual C++提供了不少的工具我们这里只使用其中的两个编译器和原代码编辑器
Delphi
我们最后要说的工具是Borland’s Delphi 它是许多新书中讨论的主题它为不同的数
据库提供了一个可以升级的界面
我们使用它的两个程序InterBase Server 和Windows ISQL WISQL
设置
在进行的足够的介绍以后我们来开始工作在你安装完你的SQL 引擎或ODBC 兼容
的编译器以后在演员开始使用材料进行工作之前你必须指定舞台无论是Oracle 7 还是
InterBase 你都需要进行登录并为你自己设立一个帐号这一过程在本质上来说是相同的
最困难的工作是为默认的口令分配硬拷贝和在线文档这两种系统都有默认的系统管理员
账号见下图
在登录和创建了用户账号以后我们就可以创建数据库了
SQL 21 日自学通(V1.0) 翻译人笨猪
287
创建数据库
从这一步开始我们对SQL 所学习的将开始得到回报首先你需要启动一个你想要
使用的数据库下图表明Oracle 7 默认是停止状态的
当你看到绿灯以后你就可以启动如下图所示的SQL*PLUS 了
在这里你可以使用CREATE 和INSERT 命令来创建表和输入你想使用的数据了另一
种常用的方法是用脚本来创建表和输入数据脚本通常是一个包含适当的SQL 命令集合的
文本文件请看下边这个用于Oracle 7 的脚本文件
------------------------------------------------------------
-- Script to build seed database for Personal Oracle
----------------------------------------------------------
-- NTES
Called from buildall.sql
-- MODIFICATIONS
SQL 21 日自学通(V1.0) 翻译人笨猪
288
-- rs 12/04/94 - Comment, clean up, resize, for production
------------------------------------------------------------
startup nomount pfile=%rdbms71%\init.ora
-- Create database for Windows RDBMS
create database oracle
controlfile reuse
logfile '%oracle_home%\dbs\wdblog1.ora' size 400K reuse,
'%oracle_home%\dbs\wdblog2.ora' size 400K reuse
datafile '%oracle_home%\dbs\wdbsys.ora' size 10M reuse
character set WE8ISO8859P1;
实际的SQL 语法随着你所使用的数据库的不同而有一些差别所以你应该看一下你的
随机文档并在你的SQL 引擎中选择文件è 打开来装入脚本文件
Borland's InterBase 使用相同的方法来装入数据下边是从一个文件中摘出的插入数据
的片断
/* Add countries. */
INSERT INTO country (country, currency) VALUES ('USA', 'Dollar');
INSERT INTO country (country, currency) VALUES ('England', 'Pound');
INSERT INTO country (country, currency) VALUES ('Canada', 'CdnDlr');
INSERT INTO country (country, currency) VALUES ('Switzerland', 'SFranc');
INSERT INTO country (country, currency) VALUES ('Japan', 'Yen');
INSERT INTO country (country, currency) VALUES ('Italy', 'Lira');
INSERT INTO country (country, currency) VALUES ('France', 'FFranc');
INSERT INTO country (country, currency) VALUES ('Germany', 'D-Mark');
INSERT INTO country (country, currency) VALUES ('Australia', 'ADollar');
INSERT INTO country (country, currency) VALUES ('Hong Kong', 'HKDollar');
INSERT INTO country (country, currency) VALUES ('Netherlands', 'Guilder');
INSERT INTO country (country, currency) VALUES ('Belgium', 'BFranc');
INSERT INTO country (country, currency) VALUES ('Austria', 'Schilling');
INSERT INTO country (country, currency) VALUES ('Fiji', 'fdollar');
分析
SQL 21 日自学通(V1.0) 翻译人笨猪
289
在本例中是向COUNTRY 表中插入国家的名字和该国家所使用的货币类型关于插入
语句的使用请参阅第8 天维护数据
这里边并没有什么魔术程序员总可以找到一些方法来减少击键的次数如果你是在
家中进行尝试那么请试着输入下边的表
INPUT
/* Table: CUSTOMER, Owner: PERKINS */
CREATE TABLE CUSTOMER (NAME CHAR(10),
ADDRESS CHAR(10),
STATE CHAR(2),
ZIP CHAR(10),
PHONE CHAR(11),
REMARKS CHAR(10));
INPUT
/* Table: ORDERS, Owner: PERKINS */
CREATE TABLE ORDERS (ORDEREDON DATE,
NAME CHAR(10),
PARTNUM INTEGER,
QUANTITY INTEGER,
REMARKS CHAR(10));
INPUT
/* Table: PART, Owner: PERKINS */
CREATE TABLE PART (PARTNUM INTEGER,
DESCRIPTION CHAR(20),
PRICE NUMERIC(9, 2));
然后向这些表中输入下边的数据
INPUT/OUTPUT
SELECT * FROM CUSTOMER
NAME ADDRESS STATE ZIP PHONE REMARKS
TRUE WHEEL 55O HUSKER NE 58702 555-4545 NONE
BIKE SPEC CPT SHRIVE LA 45678 555-1234 NONE
SQL 21 日自学通(V1.0) 翻译人笨猪
290
LE SHOPPE HOMETOWN KS 54678 555-1278 NONE
AAA BIKE 10 OLDTOWN NE 56784 555-3421 JOHN-MGR
JACKS BIKE 24 EGLIN FL 34567 555-2314 NONE
INPUT/OUTPUT
SELECT * FROM ORDERS
ORDEREDON NAME PARTNUM QUANTITY REMARKS
15-MAY-1996 TRUE WHEEL 23 6 PAID
19-MAY-1996 TRUE WHEEL 76 3 PAID
2-SEP-1996 TRUE WHEEL 10 1 PAID
30-JUN-1996 TRUE WHEEL 42 8 PAID
30-JUN-1996 BIKE SPEC 54 10 PAID
30-MAY-1996 BIKE SPEC 10 2 PAID
30-MAY-1996 BIKE SPEC 23 8 PAID
17-JAN-1996 BIKE SPEC 76 11 PAID
17-JAN-1996 LE SHOPPE 76 5 PAID
1-JUN-1996 LE SHOPPE 10 3 PAID
1-JUN-1996 AAA BIKE 10 1 PAID
1-JUL-1996 AAA BIKE 76 4 PAID
1-JUL-1996 AAA BIKE 46 14 PAID
11-JUL-1996 JACKS BIKE 76 14 PAID
INPUT/OUTPUT
SELECT * FROM PART
PARTNUM DESCRIPTION PRICE
54 PEDALS 54.25
42 SEATS 24.50
46 TIRES 15.25
23 MOUNTAIN BIKE 350.45
76 ROAD BIKE 530.00
10 TANDEM 1200.00
当你输入数据以后下一步是创建一个ODBC 联接请打开控制面板如果你使用的
是WINDOWS 95 WINDOWS 3.1 或3.11 并双击ODBC 图标
注有好几种风格的SQL 引擎可以装放ODBC VISUAL C++ DELPHI 和ORACLE 7 是
在安装的时候将ODBC 作为其一部分的幸运的是ODBC 已经变得和打印机驱动一
样普遍了
最初的ODZBC 界面如下图所示
SQL 21 日自学通(V1.0) 翻译人笨猪
291
这一屏幕给出的当前的ODBC 链接你想创建一个新的链接假设你使用的是InterBase
并且数据库的名字叫TYSSQL 你是将你的工资让调10%的那个数据库那那么请按ADD
按钮并选择InterBase 驱动如下图所示
从这里你可以转到设置屏幕并进行如下图的填写
你可以使用你自己的名字或是一些比较容易输入的东西这要依据你为你自己设置的
账号而定在这里有一个技巧至少对于我是这样的就是InterBase 想用哪一个名字作为
数据库如果你是PC 用户或小型的数据库后台可能还需要不得不使用路径名路径句可
以告诉数据库引擎在子网中的哪一台计算机中可以找到数据库
gototop
 

使用MS QUERY 来完成链接
现在我们已经建立了一个数据链接我们需要使用一个更为方便的叫作MS QUERY
的工具该工具是与VISUAL C++一同载入的我们通过使用它来解决足够的数据库和代
码问题以补偿多次编译带来的费用QUERY 通常安装在一个独立的程序组中你可以找
到它的它的外观如下图所示
选择FILE|NEW QUERY 你的TTSSQL 链接将不会出现所以我们需要按OTHER
按钮来调出ODBC 数据源对话框然后从中选择TYSSQL 如下图
可以小型数据库的用户会不习惯进行登录可是在这里你必需输入密码才能通过这一
屏幕
加入表的对话框如下图所示这里的表是与你所建立的数据库相关联的选择PART
ORDERS 和CUSTOMER 然后按关闭按钮
SQL 21 日自学通(V1.0) 翻译人笨猪
293
该工具有两个功能首先是对ODBC 链接作检查如果它可以工作就会在程序中工作
这一步可以让你确定问题是出在数据库方还是在程序一方其次是生成查询并对其进行检
查在SQL 中输入下边的语句并按OK 按钮
WHERE CUSTOMER.NAME = ORDERS.NAME AND PART.PARTNUM = ORDERS.PARTNU
下图的结果是返回的结果
你只不过完成了归并操作但是你归并的字段已经以图形的方式返回了注意在
NAME 与PARTNUM 之间的链接
QUERY 是你在WINDOWS 中工作的一个重要工具它可以让你维护表和查询你也
可以使用它来创建表和维护数据如果你使用WINDOWS 的ODBC 和SQL 工作你可以
为你或你的电脑来购买它它不像联网的DOOM 那样有趣但是它可以节省你的时间和
SQL 21 日自学通(V1.0) 翻译人笨猪
294
金钱现在我们已经建立了ODBC 链接我们也可以在编程中使用它
将VISUAL C++与SQL 结合使用
注在附件B 中有本例的源代码
启动Visual C++并调用AppWizard 如下图所示你的工程名字和子目录的名字可能
是不一样的
按OPTION 按钮并填写下图
按Data Source 按钮并对下图作出选择
SQL 21 日自学通(V1.0) 翻译人笨猪
295
现在你可以从TYSSQL 数据库中选择CUSTOMER 表了退回到AppWizard 的基本屏
幕并按两下OK 按钮再按一下OK 后会显示New Application Information 如下图所示
当程序生成以后你需要使用原代码编辑器来设计你的主屏幕选择Tools | App Studio
来装入App Studio 你需要设计的表单是很简单的只要你能在翻阅时显示足够的表列就
行你可以参照下图来设计表单
SQL 21 日自学通(V1.0) 翻译人笨猪
296
注这个程序对于你所链接的表来说是很完美的这也是使用MicroSoft Wizard 或
Borland Expert 的好处之一
将你的工作保存然后按ALT+TAB 键回到编译器来编译这个程序如果一切正常
你将会得到如下图所示的输出如果你没有得到那么你需要回头检查并再次尝试
多么好的一个程序啊要知道你现在还没有写一行代码用箭头回退到数据库处你
可以发现数据的排序与它的输出是相同的它们并没有按字母的次序排列除非你已经使
用了这个方法你该如何让它们排序呢
你所链接的数据库被封装在一个叫Ctyssqlset 的组中它是wizard 为你创建了请看
头文件
// tyssqset.h : interface of the CTyssqlSet class
//
////////////////////////////////////////////////////////////////////////
class CTyssqlSet : public CRecordset
{
DECLARE_DYNAMIC(CTyssqlSet)
public:
CTyssqlSet(CDatabase* pDatabase = NULL);
// Field/Param Data
SQL 21 日自学通(V1.0) 翻译人笨猪
297
//{{AFX_FIELD(CTyssqlSet, CRecordset)
Cstring m_NAME;
Cstring m_ADDRESS;
Cstring m_STATE;
Cstring m_ZIP;
Cstring m_PHONE;
Cstring m_REMARKS;
//}}AFX_FIELD
// Implementation
protected:
virtual CString GetDefaultConnect();// Default connection string
virtual CString GetDefaultSQL();// default SQL for Recordset
virtual void DoFieldExchange(CFieldExchange* pFX);// RFX support
}
分析
要知道在表中所有列的成员都是可变的请注意下边的的GetDefaultConnect 和
GetDefaultSQL 函数这里是tyssqset.cpp 的implementations 部分
CString CTyssqlSet::GetDefaultConnect()
{
return ODBC;DSN=TYSSQL;";
}
CString CTyssqlSet::GetDefaultSQL()
{
return "CUSTOMER";
}
GetDefaultConnect 用以确认数据库链接你不能改变它但是GetDefaultSQL 则可以让
你作一些你所感兴趣的事可以像下边这样改变它
return "SELECT * FROM CUSTOMER ORDER BY NAME";
重新编译以后你会发现结果已经排序了如下图所示
SQL 21 日自学通(V1.0) 翻译人笨猪
298
由于没有进行Microsoft Foundation Class 的漫游所以我们只能说你已经会操作
CrecordSet 和Cdatabase 对象了归并与删除表更新和插入记录以及所有使用SQL 进
行的有趣的工作对于将SQL 与VISUAL C++进行组合应用你已经学得足够了你可以
进一步学习CrecordSet 和Cdatabase 在线书籍已经成为C++软件的一部分了ODBC API
和AIPS 则由ORACLE 和SYBASE提供
将DELPHI 与SQL 结合使用
另外的一个WINDWOS 下的重要的软件平台是DELPHI 在DELPHI 中ORACLE 是
作为一个画面被载入的围绕的字符型的SQL 在C++的例子中你可以在线改写代码在
使用DELPHI 时你可以归并两个表而无需写哪怕是最简单的代码
注该程序的代码在附件C 中提供
双击DELPHI 图标来启动DELPHI 程序的外观如下图所示
SQL 21 日自学通(V1.0) 翻译人笨猪
299
当你开始进行编程时你需要对ODBC 联接进行注册从工具菜单中选择BDE Borland
Database 环境并填写下图的对话框
双击图下部的ALIASES 标签为TYSSQL 分配别名如下图
选择文件|新表单进行下边的选择从EXPORT 表中选择DATABASE FORM 如下图
所示
SQL 21 日自学通(V1.0) 翻译人笨猪
300
选择master/detail form 和TQuery objects 如下图所示
现在选择你早些时候的TYSSQL 数据源如下图所示
SQL 21 日自学通(V1.0) 翻译人笨猪
301
将PART 表作为主表
选择其中的所有字段如下图
SQL 21 日自学通(V1.0) 翻译人笨猪
302
选择水平显示模式如下图
然后选择ORDERS 表并选择其中的所有字段显示模式选择为GRID 如下边的三
个图所示
现在软件允许你进行归并了确认以PARTNUM 进行归并如下图
SQL 21 日自学通(V1.0) 翻译人笨猪
303
现在回到前边并生成表单结果如下图所示
编译并运行这个程序当你选择不同的PART 以后在下边的表中将会出现订单如
下图所示
SQL 21 日自学通(V1.0) 翻译人笨猪
304
关闭工程并单击一个或全部表单上的查询对象当你单击一个对象以后对象浏览器
将会显示它们的属性的不同
这个查询已经试验成功了但是我们并没有写一行代码
总结
在今天我们学习了SQL 在应用程序中的一般应用每一天的学习都会让我们找到硬盘
之中的一些新内容最好的学习方法是你来学习如何去写查询进行你所能进行的查询试

gototop
 

问与答
问为什么ODBC 的API 与SYBASE和ORACLE 的API 会不相同
答在从函数到函数级的调用上ORACLE 与SYBASE 的功能是非常类似的但与
此不同的是许多数据库供应商都让它的数据库系统离开的通用的标准ODBC 的API 通
常性更好— — 它并不针对任何特定的数据库如果你需要特定的数据库并要求它提供高的
性能那你就需要使用数据库对你提供的API 函数库
问在所有的可用的产品中我如何知道该使用哪一个
答作为商业的环境产品的选择通常从可管理性和可学习性两方面来考虑管理性
决定的产品的价格而可学习性而可以让它更容易使用在最好的程序环境中你可以解决
问题非常的讯速而有效
校练场
1 在VISUAL C++中提供了几个SQL 对象
2 在DELPHI 中提供了几个SQL 对象
3 什么是ODBC
4 DELPHI 可以做什么
练习
1 在C++的例子中如何对STATE 字段进行正序或逆序的排序操作
2 在向前一步找到所有需要使用SQL 的程序并使用它
gototop
 

第二周回顾
l 在第一周我们主要把时间用在了介绍一个非常重要的主题— — SELECT 语句
l 在第二周则对SQL 的进行了分门别类的详细介绍
l 在第8 天主要介绍的是数据维护语言通过这些语句你可以修改数据库中的数据
三个最为通用的命令是INSERT DELETE 和UPDATE
l 第九天介绍了如何设计和创建一个数据库主要命令有CREATE DATABASE 和
CREATE TABLE 在表中可以创建任意数量的字段它们中的每一个都有着由数
据库供应商所定义的数据类型而DROP DATABASE 和DROP TABLE 语句的作
用则是删除数据库和表
l 第十天讲了两种显示数据的方法视图和索引视图是用SELECT 语句的输出所
创建的一个虚似表索引则可以其于给定的一个或一组字段对数据库中的记录进
行排序
l 第11 天的主要内容是事务管理在这里你第一次体验到了使用数据库进行编程
事务用BEGIN TRANSCAT 语句来开始COMMIT TRANSCAT 语句用来确认事
务而ROLLBACK TRANSCAT 语句则用来取消事务
l 第12 天的主要内容集中在数据库安全上尽管数据库安全的实现方法因数据库产
品的不同而不同但大多数是用GRANT 和REVOKE 语句来实现的GRANT 语
句用以给用户授权REVOKE 则用以去除这些权限
l 第13 天主要内容是在应用程序开发环境中使用SQL 静态SQL 需要进行预编译
在运行时是不会改变的动态SQL 则由于它的灵活性在近几年应用很广用动态
SQL 进行编程的例子是VISUAL C++和DELPHI 开发工具
l 第14 天SQL 的高级内容游标可以在一个记录集中翻阅存储过程是一种数据
库对象它可以在一行中执行多个SQL 语句它也可以接受和返回数值触发机
制是一种特殊类型的存储过程它可以在向数据库中插入删除和更新数据时自动运行
gototop
 

第二周学完了,请看《SQL 21 日自学通-3》
gototop
 

附件B 在第14 天中的C++源代码清单
// tyssqvw.h : interface of the CTyssqlView class
//
/////////////////////////////////////////////////////////////////////////////
class CTyssqlSet;
class CTyssqlView : public CRecordView
{
protected: // create from serialization only
CTyssqlView();
DECLARE_DYNCREATE(CTyssqlView)
public:
//{{AFX_DATA(CTyssqlView)
enum { IDD = IDD_TYSSQL_FORM };
CTyssqlSet* m_pSet;
//}}AFX_DATA
// Attributes
public:
CTyssqlDoc* GetDocument();
// Operations
public:
virtual CRecordset* OnGetRecordset();
// Implementation
public:
virtual ~CTyssqlView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
SQL 21 日自学通(V1.0) 翻译人笨猪
505
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV support
virtual void OnInitialUpdate(); // called first time after construct
// Generated message map functions
protected:
//{{AFX_MSG(CTyssqlView)
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
#ifndef _DEBUG // debug version in tyssqvw.cpp
inline CTyssqlDoc* CTyssqlView::GetDocument()
{ return (CTyssqlDoc*)m_pDocument; }
#endif
/////////////////////////////////////////////////////////////////////////////
// tyssql.h : main header file for the TYSSQL application
//
#ifndef __AFXWIN_H__
#error include 'stdafx.h' before including this file for PCH
#endif
#include "resource.h" // main symbols
/////////////////////////////////////////////////////////////////////////////
// CTyssqlApp:
// See tyssql.cpp for the implementation of this class
//
class CTyssqlApp : public CWinApp
{
public:
CTyssqlApp();
SQL 21 日自学通(V1.0) 翻译人笨猪
506
// Overrides
virtual BOOL InitInstance();
// Implementation
//{{AFX_MSG(CTyssqlApp)
afx_msg void OnAppAbout();
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// tyssqset.h : interface of the CTyssqlSet class
//
/////////////////////////////////////////////////////////////////////////////
class CTyssqlSet : public CRecordset
{
DECLARE_DYNAMIC(CTyssqlSet)
public:
CTyssqlSet(CDatabase* pDatabase = NULL);
// Field/Param Data
//{{AFX_FIELD(CTyssqlSet, CRecordset)
CString m_NAME;
CString m_ADDRESS;
CString m_STATE;
CString m_ZIP;
CString m_PHONE;
CString m_REMARKS;
//}}AFX_FIELD
// Implementation
protected:
SQL 21 日自学通(V1.0) 翻译人笨猪
507
virtual CString GetDefaultConnect(); // Default connection string
virtual CString GetDefaultSQL(); // default SQL for Recordset
virtual void DoFieldExchange(CFieldExchange* pFX); // RFX support
};
// tyssqdoc.h : interface of the CTyssqlDoc class
//
/////////////////////////////////////////////////////////////////////////////
class CTyssqlDoc : public CDocument
{
protected: // create from serialization only
CTyssqlDoc();
DECLARE_DYNCREATE(CTyssqlDoc)
// Attributes
public:
CTyssqlSet m_tyssqlSet;
// Operations
public:
// Implementation
public:
virtual ~CTyssqlDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
virtual BOOL OnNewDocument();
// Generated message map functions
protected:
//{{AFX_MSG(CTyssqlDoc)
// NOTE - the ClassWizard will add and remove member functions here.
SQL 21 日自学通(V1.0) 翻译人笨猪
508
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions (including VB)
#include <afxdb.h> // MFC database classes
////////////////////////////////////////////////////////////
gototop
 

//{{NO_DEPENDENCIES}}
// App Studio generated include file.
// Used by TYSSQL.RC
//
#define IDR_MAINFRAME 2
#define IDD_ABOUTBOX 100
#define IDD_TYSSQL_FORM 101
#define IDP_FAILED_OPEN_DATABASE 103
#define IDC_NAME 1000
#define IDC_ADDRESS 1001
#define IDC_STATE 1002
#define IDC_ZIP 1003
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
SQL 21 日自学通(V1.0) 翻译人笨猪
509
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1004
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
///////////////////////////////////////////////////
// mainfrm.h : interface of the CMainFrame class
//
/////////////////////////////////////////////////////////////////////////////
class CMainFrame : public CFrameWnd
{
protected: // create from serialization only
CMainFrame();
DECLARE_DYNCREATE(CMainFrame)
// Attributes
public:
// Operations
public:
// Implementation
public:
virtual ~CMainFrame();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
// Generated message map functions
protected:
SQL 21 日自学通(V1.0) 翻译人笨猪
510
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
// NOTE - the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
// tyssqvw.cpp : implementation of the CTyssqlView class
//
#include "stdafx.h"
#include "tyssql.h"
#include "tyssqset.h"
#include "tyssqdoc.h"
#include "tyssqvw.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTyssqlView
IMPLEMENT_DYNCREATE(CTyssqlView, CRecordView)
BEGIN_MESSAGE_MAP(CTyssqlView, CRecordView)
//{{AFX_MSG_MAP(CTyssqlView)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTyssqlView construction/destruction
SQL 21 日自学通(V1.0) 翻译人笨猪
511
CTyssqlView::CTyssqlView()
: CRecordView(CTyssqlView::IDD)
{
//{{AFX_DATA_INIT(CTyssqlView)
m_pSet = NULL;
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CTyssqlView::~CTyssqlView()
{ }
void CTyssqlView::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTyssqlView)
DDX_FieldText(pDX, IDC_ADDRESS, m_pSet->m_ADDRESS, m_pSet);
DDX_FieldText(pDX, IDC_NAME, m_pSet->m_NAME, m_pSet);
DDX_FieldText(pDX, IDC_STATE, m_pSet->m_STATE, m_pSet);
DDX_FieldText(pDX, IDC_ZIP, m_pSet->m_ZIP, m_pSet);
//}}AFX_DATA_MAP
}
void CTyssqlView::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_tyssqlSet;
CRecordView::OnInitialUpdate();
}
/////////////////////////////////////////////////////////////////////////////
// CTyssqlView diagnostics
#ifdef _DEBUG
void CTyssqlView::AssertValid() const
SQL 21 日自学通(V1.0) 翻译人笨猪
512
{
CRecordView::AssertValid();
}
void CTyssqlView::Dump(CDumpContext& dc) const
{
CRecordView::Dump(dc);
}
CTyssqlDoc* CTyssqlView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTyssqlDoc)));
return (CTyssqlDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTyssqlView database support
CRecordset* CTyssqlView::OnGetRecordset()
{
return m_pSet;
}
/////////////////////////////////////////////////////////////////////////////
// CTyssqlView message handlers
// tyssqset.cpp : implementation of the CTyssqlSet class
//
#include "stdafx.h"
#include "tyssql.h"
#include "tyssqset.h"
/////////////////////////////////////////////////////////////////////////////
// CTyssqlSet implementation
IMPLEMENT_DYNAMIC(CTyssqlSet, CRecordset)
CTyssqlSet::CTyssqlSet(CDatabase* pdb)
SQL 21 日自学通(V1.0) 翻译人笨猪
513
: CRecordset(pdb)
{
//{{AFX_FIELD_INIT(CTyssqlSet)
m_NAME = "";
m_ADDRESS = "";
m_STATE = "";
m_ZIP = "";
m_PHONE = "";
m_REMARKS = "";
m_nFields = 6;
//}}AFX_FIELD_INIT
}
CString CTyssqlSet::GetDefaultConnect()
{
return "ODBC;DSN=TYSSQL;";
}
CString CTyssqlSet::GetDefaultSQL()
{
return "SELECT * FROM CUSTOMER ORDER BY NAME";
}
void CTyssqlSet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CTyssqlSet)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, "NAME", m_NAME);
RFX_Text(pFX, "ADDRESS", m_ADDRESS);
RFX_Text(pFX, "STATE", m_STATE);
RFX_Text(pFX, "ZIP", m_ZIP);
RFX_Text(pFX, "PHONE", m_PHONE);
RFX_Text(pFX, "REMARKS", m_REMARKS);
SQL 21 日自学通(V1.0) 翻译人笨猪
514
//}}AFX_FIELD_MAP
}
// tyssql.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "tyssql.h"
#include "mainfrm.h"
#include "tyssqset.h"
#include "tyssqdoc.h"
#include "tyssqvw.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTyssqlApp
BEGIN_MESSAGE_MAP(CTyssqlApp, CWinApp)
//{{AFX_MSG_MAP(CTyssqlApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTyssqlApp construction
CTyssqlApp::CTyssqlApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
SQL 21 日自学通(V1.0) 翻译人笨猪
515
/////////////////////////////////////////////////////////////////////////////
// The one and only CTyssqlApp object
CTyssqlApp NEAR theApp;
/////////////////////////////////////////////////////////////////////////////
// CTyssqlApp initialization
BOOL CTyssqlApp::InitInstance()
{
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
SetDialogBkColor(); // Set dialog background color to gray
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTyssqlDoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CTyssqlView));
AddDocTemplate(pDocTemplate);
// create a new (empty) document
OnFileNew();
if (m_lpCmdLine[0] != '\0')
{
// TODO: add command line processing here
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
gototop
 

// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// Implementation
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
SQL 21 日自学通(V1.0) 翻译人笨猪
517
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// App command to run the dialog
void CTyssqlApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
/////////////////////////////////////////////////////////////////////////////
// CTyssqlApp commands
// tyssqdoc.cpp : implementation of the CTyssqlDoc class
//
#include "stdafx.h"
#include "tyssql.h"
#include "tyssqset.h"
#include "tyssqdoc.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTyssqlDoc
IMPLEMENT_DYNCREATE(CTyssqlDoc, CDocument)
BEGIN_MESSAGE_MAP(CTyssqlDoc, CDocument)
//{{AFX_MSG_MAP(CTyssqlDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
SQL 21 日自学通(V1.0) 翻译人笨猪
518
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTyssqlDoc construction/destruction
CTyssqlDoc::CTyssqlDoc()
{
// TODO: add one-time construction code here
}
CTyssqlDoc::~CTyssqlDoc()
{ }
BOOL CTyssqlDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CTyssqlDoc diagnostics
#ifdef _DEBUG
void CTyssqlDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CTyssqlDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
SQL 21 日自学通(V1.0) 翻译人笨猪
519
/////////////////////////////////////////////////////////////////////////////
// CTyssqlDoc commands
// stdafx.cpp : source file that includes just the standard includes
// stdafx.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
// mainfrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "tyssql.h"
#include "mainfrm.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// arrays of IDs used to initialize control bars
// toolbar buttons - IDs are command buttons
static UINT BASED_CODE buttons[] =
{
SQL 21 日自学通(V1.0) 翻译人笨猪
520
// same order as in the bitmap 'toolbar.bmp'
ID_EDIT_CUT,
ID_EDIT_COPY,
ID_EDIT_PASTE,
ID_SEPARATOR,
ID_FILE_PRINT,
ID_SEPARATOR,
ID_RECORD_FIRST,
ID_RECORD_PREV,
ID_RECORD_NEXT,
ID_RECORD_LAST,
ID_SEPARATOR,
ID_APP_ABOUT,
};
static UINT BASED_CODE indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
}
CMainFrame::~CMainFrame()
{ }
SQL 21 日自学通(V1.0) 翻译人笨猪
521
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.Create(this) ||
!m_wndToolBar.LoadBitmap(IDR_MAINFRAME) ||
!m_wndToolBar.SetButtons(buttons,
sizeof(buttons)/sizeof(UINT)))
{
TRACE("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE("Failed to create status bar\n");
return -1; // fail to create
}
return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
SQL 21 日自学通(V1.0) 翻译人笨猪
522
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
gototop
 

附件C 第14 天中的Delphi 源代码清单
program Tyssql;
uses
Forms,
Unit1 in 'UNIT1.PAS' {Form1},
Unit2 in 'UNIT2.PAS' {Form2};
{$R *.RES}
begin
Application.CreateForm(TForm2, Form2);
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
unit Unit1;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
SQL 21 日自学通(V1.0) 翻译人笨猪
524
end.
unit Unit2;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
StdCtrls, Forms, DBCtrls, DB, DBGrids, DBTables, Grids, Mask, ExtCtrls;
type
TForm2 = class(TForm)
ScrollBox: TScrollBox;
Label1: TLabel;
EditPARTNUM: TDBEdit;
Label2: TLabel;
EditDESCRIPTION: TDBEdit;
Label3: TLabel;
EditPRICE: TDBEdit;
DBGrid1: TDBGrid;
DBNavigator: TDBNavigator;
Panel1: TPanel;
DataSource1: TDataSource;
Panel2: TPanel;
Panel3: TPanel;
Query1: TQuery;
Query2: TQuery;
DataSource2: TDataSource;
procedure FormCreate(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
SQL 21 日自学通(V1.0) 翻译人笨猪
525
var
Form2: TForm2;
implementation
{$R *.DFM}
procedure TForm2.FormCreate(Sender: TObject);
begin
Query1.Open;
Query2.Open;
end;
end.
gototop
 
12345   5  /  5  页   跳转
页面顶部
Powered by Discuz!NT