2024年6月11日发(作者:)
・情报技术・
JournalofInformationNo.7,2003
浅谈网络数据库系统的设计和开发
刘 雷 朱志清
(
河北经贸大学 石家庄
050061
)
摘 要 探讨了网络数据库的设计模式、客户端程序设计和服务器程序的优化
,
以及网络应用中避免并发的各种解决
方法的优缺点。
关键词 网络数据库 程序设计 设计模式
用
XBase
开发的程序在系统老化之后
,
不应盲目推翻重
来
,
而是要利用新技术把原有资源转化
,
以适应现在的需求。
XBase
型数据库比较适合转化成网络数据库。做网络数据库要
不提倡直接建立数据库、表格
,
输入数据。我们采取的方法是
利用已有
DBF
数据库
,
在
Delphi
的
DatabaseDesktop
把
DBF
转
换成
SQLServer
中的表格
,
这样
XBase
开发的程序的资源就不
会浪费了。对新表
,
用
FoxBase
建表格
,
输入数据后再转换。具
体方法是
:
先用
ODBC
建立与
SQLServer
连接的数据源
,
用
DatabaseDesktop
的菜单项
TOOLS->UTILITIES->COPY
有前台的应用程序和后台的网络数据库。前台程序的开发平
台可以用
Delphi
、
VisualFoxPro
和
PowerBuilder,
后台的网络数
据库可以是
Novell
的
Sybase
、
WindowsNT
的
SQLServer
、
UNIX
的
Informix,
以及
DB/2forNT
等等。
Client/Server
模式的突出优点是数据集中化
,
跨系统信息
的功能。其实这个工具可以进行异种数据库转换
,
在本身具有
ODBC
驱动程序或
Delphi
的
SQLLINK
支持的数据库之间任意
共享
,
便于数据管理和维护
,
但对客户端维护困难的问题我们
在后面提出一个解决方法。客户端与主服务器通过网络以
TCP/IP
协议连接。客户端可以并发的存取主服务器上的数
进行转换。
1
1
3
前台程序的基本编程
Delphi
与后台数据库的连接可
有两种途径
:
一是
ODBC,
这是标准
,
兼容性很好
;
二是
Delphi
带
的
SQLLink,
它由
Delphi
自己开发
,
速度稍快
,
但我们在应用中
发现
SQLLink
对有些数据库系统的支持并不是很稳定
,
如连
Informix
时
,
退出时就很容易死机
,
所以常以
ODBC
连接数据
据
,
系统管理员可以在主服务器上监视客户的上线情况及数据
库的使用情况
,
做到实时监控。
Delphi
是
Borland
(
已经更名
In
2
prise
)
的产品
,
控件多
,
比较适合数据库开发。下面用
Delphi3.0
C/SforWin95
做前台应用程序
,
后台采用
WindowsNT
的
SQL
SERVER6.5
(
以下简称
SQL
服务器
)
做服务器来说明一个程序
库。在控制面板的
ODBC
中需要设置数据源名称、服务器名称
(
如果不设置登录的数据库名称
,
就将登录到后台数据库给你
的开发过程及注意事项。
1
基本编程原理和步骤
这个用户的默认数据库
)
。
Delphi
是快速开发工具
(
RAD
)
中最容易上手的
,
编程一般
经过三个步骤
:
注册
ODBC
数据源
;
配置
BDE;
往
FROM
上放
置
Query/Table
、
DataSource
、
DBgrid
控件
,
分别设置控件属性以
实现与数据库的连接操作。
Delphi
涉及数据库编程的控件有两类
:
数据显示控件用来
1
1
1
开发环境 我们在开发
Client/Server
应用程序时需要
两台机器
(
服务器
,
一个客户机
)
,
但
Delphi
可以做到单机开发。
Delphi
的可伸缩性很强
,
把应用程序由单层过渡到两层
,
只要简
单地把连接的数据集由本机的数据库重新指向
SQL
服务器即
可。像
PowerBuild
一样
,Delphi
也有本地库
,
这就是
InterBase
Server,
它提供了一个单用户多实例的
SQL
服务器平台
,
可以做
显示数据库内的数据
,DBGrid
用于全屏显示和编辑数据库表中
的记录
;
数据连接控件负责掌管数据库的连接。
Database
控件是为开发两层数据库应用程序时
,
设置登录
测试平台。我们在将数据库应用程序转移到对
Sybase
等远程
数据库的访问之前
,
可以在
LocalInterBaseServer
平台建立和测
试数据库应用程序
,
这样可暂时不考虑网络连接
,
专心致力于
解决业务逻辑。当业务逻辑实现后
,
只要把
Database
控件中的
Aliasname
改成新的数据源即可将程序扩大到网络环境
,
大大提
数据库的有关参数
;Query
控件是用来传递
SQL
语句到服务器
上得到一个数据集或执行一个动作
;Datasource
控件是连接数
据显示控件和数据连接控件的桥梁。
Query
控件执行静态
SQL
语句的写法是
:
;
(
‘
,
)
;*FROMdatabasename
’
高了开发软件的效率
,
并且降低了开发难度。
1
1
2
后台建立数据库并创建连接 数据库建立包括安装系
统、建库建表、对数据库写触发子和存储过程。
安装时要注意把
SQLServer
的客户数留到
50
以上
,
否则
服务器会在用户多了以后死锁。
SQLServer
是图形化的管理
,
库表的建立非常容易。我们
值得一提的是
Delphi
中还有种动态
SQL,
可以嵌入变量参
数
,
给编程带来极大方便。
;
(
‘
)
;ksWHEREpylike:py
’
60
情报杂志
2003
年第
7
期
・情报技术・
+
‘
%
’
Try
L;
DoSQL:=1;
Except
(
改状态时发生共享冲突
,
要重试吗’
IFMessageDlg
‘
,
mtConfirmation,[mbYes,mbNo],0
)
=mrNoThenExit;
end;
end;
(
py
’
)
.AsString:=yName
‘
;
Query
控件的执行方法有两种
:Open,ExecSQL
。
Open
方式
可以打开所联系的数据表格
,
得到一个数据集
;ExecSQL
方式
则只是运行
SQL
语句
,
并不将运行后的表格送往相连的数据显
示控件
,
所以执行像
UpdatedatanameSet
…
,Delete
…
FROM
…的
动作
,
就要用
ExecSQL
。
当应用程序第一次访问
SQL
数据库
,
会触发一个自动连接
过程。连接过程需要确认访问数据库的权限。如果你要在程
序中接受口令
,
则必须把
Database
控件的
LoginPrompt
属性设
为
False
。
(
username=
’
+myusername
)
;//myusername
变
‘
在实际中还有一种情况也可能引起共享冲突
,
这就是缓存
更新。应用程序往数据库中写数据
,
先放在本地的缓冲区里然
后由
BDE
提交
,
这样在多用户情况下就可能发生数据同时由缓
存向数据库提交的情况
,
引起共享冲突。所以对频繁修改的数
据要取消缓存更新。
在数据库的应用中
,
利用临时表也能减小冲突的概率。利
用
SQL
语句可以在服务器上建立临时表
,
临时表会在使用完后
被系统自动删掉。
例如下面语句分别把查询结果和统计结果放入临时表
:
SELECT*FROMDatabaseNameINTOtemptemptable..
SELECTcity-id,COUNT
(
*
)
lzcount,SUM
(
jour-amt
)
lzsumFROMdb-
connect
WHEREflag=
“
2
”
GROUPBYcity-idORDERBYcity-idINTOTEMP
tempdatabase
’
量名
(
password=
’
‘
+mypassword
)
;
ted:=true;
关于日期的处理
,
如果不存在
2000
年问题
,
只要在
Form.
OnCreate
事件中加上
ShortDateFormat:=
‘
mm/dd/dddd/yyyy
’
;
mm:
有前导
0
的月份
;dd:
有前导
0
的日期
;dddd:
表示这一天
是星期几
;yyyy:
四位年份。此外
,
在
Delphi
中的
BDEAminis
2
trator
中的
Configuration
→
System
→
Formats
中有资料介绍
,
此方
法的可行性尚未得到证实。
2
事务处理
3
系统优化
在客户
/
服务器应用程序中
,
事务控制用来维护数据一致
性。
Delphi
中提供了事务的隐式和显式方法。隐式控制对写入
数据库的数据的每一行都要进行事务控制
,
导致网络繁忙和程
序性能下降
;
用显式控制能自定义开始、提交和终止事务的过
程
,
因而网络开销小
,
性能高。
显式控制有两种方法
:
a.
利用
Database
控件。
Database
控件用于事务控制的属性
3
1
1
服务器端 要尽可能把客户端的工作向服务器上移
植。在服务器上大量使用触发子预处理程序、完整性约束才能
做到真正意义上的瘦客户端。
Delphi
可以用
Query
控件传递
SQL
语句到服务器端
,
而且可以动态地在服务器端创建存储过
程
,
用
StoreProc
控件调用服务器上的存储过程。一些涉及大量
记录的工作任务因此可以用存储过程改写。对唯一性字段
(
身
份证号
,
凭证提交号
)
可以作为数据库主键
,
让重复数据不能入
库
,
省去客户端对数据的检测。
下面的例子是利用触发子做数据库
RS
的更新日志功能
:
FORupdate
AS
declare@oldvaluechar
(
20
)
SELECT@oldvalue=xmFROMdeleted
declare@newvaluechar
(
20
)
SELECT@newvalue=xmFROMinserted
insertlogvalues//
往
LOG
表中写。
(
rs
数据库’‘‘用户’
,+user-name
()
,GETDATE
()
,@oldvalue,@newval
2
)
ue
‘更新’
,
//User-name
()
,GetDate
()
是
SQLSERVER
系统函数
是
TransIsolation,
方法有
StartTranstion
、
Commit
和
Rollback
。标
准写法如下
:
ransaction;
Try
;//
具体处理
(
updatedatabasenamesetgz=gz+1
’
)
;
‘
L;
;
Except
ck;//
遇异常
,
回滚
End;
b.
直接利用远程
SQL
服务器的事务处理功能
,
把
SQL
语
句通过
Query
控件传递到服务器上。当程序不用本地库时
,
可
以使用这种方法
,
但要用在
BDE
将
SQLPassThroughMode
设置
为
NOTSHARED
。程序中我们可采用如下结构
:
(
确认改标志位
?
’
IFMessageDlg
‘
,mtConfirmation,[mbYes,mbNo],0
)
=
mrYesthen
Begin
DoSQL:=0;//
用一个变量做标志
;//
改状态。
(
update
…
)
’
)
;
‘
Set
…
WhileDoSQL=0do
3
1
2
客户端
3
1
2
1
1
客户端禁用
Table
控件。如对数据库的一个字段
进行求和
,Table
控件的做法是把整个数据集传到客户机上
,
然
后累加。而
Query
控件则是把
SQL
语句传到服务器上
,
由服务
器统计出结果。两者相比
,Query
在网络上只传回较少数据
,
而
Table
传输的数据较多。
3
1
2
1
2
去除无用代码。有时程序中无用的代码占据大量
空间
,
在程序调试过程中
,
可整理代码。方法是在调试时不用
61
・情报技术・
对话框中选择
Cancel
即可去除无用代码。
JournalofInformationNo.7,2003
编译或保存
,
打开
File
菜单
,
选择
,
在保存文件
3
1
2
1
3
减少不必要的
I/O
。要加快客户端程序的速度
,
就
多小的视图
,
不同的用户连接到不同的视图上
,
实现数据的真
正隔离
,
可使客户端程序在结构上进行简化
,
客户端程序运行
时连接服务器的用户表
,
从中找到与用户名对应的视图名
,
便
于管理
,
在服务器上可以强行注销用户。
应用程序在编译调试后立即推广使用
,
存在很大隐患
,
所
以建议将编译后的可执行文件进行压缩处理。对
WindowsPE
格式进行一次或多次的压缩
,
使可执行文件变小
,
变形。现在
常用的是
Upx,Wwpack32,Aspack
。
6
程序的网上维护
要减少不必要的屏幕显示。例如
,
如果我们对流水表进行本地
密押的循环处理时
,
数据显示控件
DBgrid
会随着数据存取控件
Table
、
Query
中的数据指针的移动而向下翻屏
,
若表有
1000
条
记录
,
翻屏的时间都会比数据处理的时间多
1/3
。若处理时间
总共
10
秒
,
翻屏的时间就有
3
秒。利用
Query
部件的
Disable
2
Controls
和
EnableControl
方法
,
可以用来隐藏和显示数据变化。
eControls;
Begin
//..dowork
End
Control;
;
用
Dephi
写的数据库程序安装到客户端时要有数据库引擎
BDE
的支持
,
否则客户端将不能连接到服务器。在分发程序时
要把数据库引擎
BDE
打包做成安装盘
,
每个客户端都要安装
一套
BDE
。这就是两层结构的不足之处
,
所以现在就有了多层
结构
:
提倡
Web
方式
(
客户端就是一个浏览器
)
或多层方式
(
在
两层基础上增加一个应用服务器
,
利用
DCom
或
OLEnterPrise
或
Corba,
使客户端的数据库引擎
BDE
中央化
)
。但多层结构
费用高
,
系统复杂。
两层结构的系统怎样在现有的基础上克服这个缺点
?
由于
Delphi
有
Session
控件的支持
,
即使
BDE
需要重新配
置
,
也可以在程序中用代码轻易实现。所以
BDE
在客户端只需
安装一次
,
配置的改变可由升级程序完成。每次维护升级只要
从指定服务器上下载可执行文件即可
,
而无须再次安装
BDE
。
我们可以仿照
NortonUtilityforWin95
的方法
,
在主程序中
做一个
LiveUpdate,
在线升级。具体方法是做一个引导程序
,
客
户端每次从引导程序开始执行。引导程序先判断是否有下载
的新程序
,
有则覆盖主程序
,
并做老程序的备份
,
没有则调用主
程序
,
继续执行。
这种方式也可以实现众多客户端与系统管理员的联系。
7
Delphi
和
PowerBuild
的对比
3
1
2
1
4
编译优化。由于在编译时
,
一些运行库的代码也编
译到可执行文件中
,
所以编译出的可执行文件较大
,
一般有
500K
以上
,1-2
兆也很平常。此种文件不但占用了硬盘空间
,
而且在运行时也多占系统资源
,
更加不利于网上更新。所以一
般在编译时选择程序包
(
PACKAGE
)
方式。程序包是
Delphi
应
用程序和编程环境所使用的特定的动态连接库。像
一样
,
在分发程序时独立交付
,
因此使编译的
可执行文件长度骤减
,
速度明显加快
,
减少了系统资源的占用。
4
帮助系统的设计
帮助系统大致可以有三种设计方法
:
a.
做成
WinHelp
调用的
HLP
文件
(
这是通常的模式
)
。
b.
做成
HTML
格式。我们现在的客户平台基本上为
Win
2
dows95OSR2,
自身带有
IE
浏览器
,
可以直接调用。在
Delphi
中有
Internet
组件的支持可以直接读
HTML,
它的范例程序就
有一个浏览器的写法。
c.
做成动画结构的帮助文件。用户在点击帮助后
,
放一段
在
Windows
平台下给一种编程语言打分的标准是看编译
器的功能和速度
,
能否在语言中嵌入汇编
,
编译后的可执行文
件是真正的机器码还是
P-code
解释系统
,
对
WindowsApi
函
数调用支持程度如何。
PowerBuild
是数据库专用的开发平台
,
虽有
watcomC++
相关内容的实际操作过程动画。动画制作的实现有两种方式
:
一是用
3dsMax
渲染成
AVI
格式
,
用
Windows
自带的
Media
Player
或
ActiveMovie
播放
;
二是用把示范动作录制成
AVI
再
变为
EXE
格式
,
在程序中用
WinApi
函数
WinExec
调用。在
Office97
中
,
有一个附加程序叫
MicrosoftCamcorder,
它可以录
的支持
,
可以扩充功能
,
但真正写起来不是很容易。
PowerBuild
的编译结果不是真正的二进制。虽然要比
VB
那种在代码外套
上一层解释外壳的
EXE
要好
,
但不如
Delphi
。
Delphi
能在源程序中嵌入汇编
,
能把所有
WindowsApi
函
制计算机执行的操作、过程和声音
,
既可以将录制的内容保存
为影片
,
然后在
Camcorder
中播放
,
也可以将影片保存为能够独
立运行的程序
,
以便发送给其他人播放
,
而无须
Camcorder
环
境。
我们提倡第二种与第三种方法结合使用。
5
安全性讨论
数当做自己的内部函数来调用
,
而调用格式上无任何变化。这
就意味着用
Delphi
可以重新构造一个
Windows95
的外壳。
Del
2
phi
最大的优点就是它门类齐全
,
数据库应用、系统程序、网络应
用
(
浏览器
应用
)
、工业控制
,
甚至病毒。
参考资料
1
林 江1利用
Delphi
开发网络数据库应用1计算机世界日报
2
周海滨1网络数据库的实现1中国计算机报
,1997;
(
679
)
(
责编
:
钧加勃
)
一个网络数据库会有很多用户使用
,
每类用户要限定对数
据库信息的访问权限。譬如我们的系统有三类用户
:
人事科
,
行长
,
一般用户。人事科的权限最大
,
可对数据库进行读写操
作
;
行长只能读所有的数据
;
一般用户只能访问到一些基本的
信息。这类问题我们可以用视图来解决
,
把大数据库派生出很
62


发布评论