资源描述
数据库应用系统开发_程序代码
———————————————————————————————— 作者:
———————————————————————————————— 日期:
2
个人收集整理 勿做商业用途
数据库应用系统开发
数据库系统开发案例—图书现场采购系统
系统主窗体的实现
1.数据表结构的实现
经过前面的需求分析和概念结构设计以后,得到了数据库的逻辑结构.现在就可以在SQL Server 2000数据库系统中实现该逻辑结构。可以直接在SQL Server 2000企业管理器中创建表,也可以在SQL查询分析器中创建。下面给出在查询分析器中创建这些表的SQL语句,读者可以将这些表创建在系统的pubs数据库中。
(1)创建书商图书基本信息表bookseller_bookinfo
CREATE TABLE bookseller_bookinfo(
rec_id Bigint PRIMARY KEY nextval(’serial'),
isbn varchar(20) null,
bookname varchar(200) null,
author varchar(50) null,
publisher_date varchar(50) null,
publisher varchar(50) null,
class_name varchar(50) null,
book_price numeric DEFAULT 0,
book_num int DEFAULT 0,
provider varchar(50) null
)
(2)创建图书馆图书馆藏基本信息表library_bookinfo
CREATE TABLE library_bookinfo (
rec_id Bigint PRIMARY KEY nextval('serial’),
isbn varchar(20) null,
bookname varchar(200) null,
author varchar(50) null,
publisher_date varchar(50) null,
publisher varchar(50) null,
class_name varchar(50) null,
book_price numeric DEFAULT 0,
book_num int DEFAULT 0,
provider varchar(50) null
)
(3)创建用户注册表userenroll_info
CREATE TABLE userenroll_info (
rec_id int PRIMARY KEY nextval('serial'),
machine varchar(50) null,
decode varchar(50) null
)
2.系统主窗体的创建
上面的SQL语句在SQL Server 2000中查询分析器执行后,将自动产生需要的所有表。有关数据结构的所有后端工作已经完成。现在将通过图书现场采购系统中功能模块的实现,介绍如何使用Visual Basic来编写数据库系统的客户端程序。
(1)创建工程项目BOOKCG_MIS
启动VB,在VB工程模板中选择“标准 EXE",VB将自动产生一个Form窗体,这里删除这个窗体。单击“文件→保存工程”菜单项,保存工程,将这个工程命名为BookCG_MIS。vbp。
(2)创建图书现场采购管理系统主窗体
Visual Basic创建的应用程序可以是SDI(单文档界面)和MDI(多文档界面)。这里采用MDI多文档界面,可以使程序更为美观、整齐有序。
单击工具栏中的“添加MDI窗体”按钮,添加一个多文档界面,后单击工具栏中的“菜单编辑器”创建主窗体的菜单,生成一个如图14-15所示的主窗体,主窗体的Caption属性设为“图书现场采购管理系统”,Name属性为“frmmain”。主窗体保存文件名为frmmain。frm.菜单结构参考图14-12。
图14—15 系统主窗体
(3)创建公用模块
在Visual Basic中可以用公用模块来存放整个工程项目公用的函数、全局变量等.便于各窗体模块调用公用模块中的函数、变量,以提高代码的效率。在项目资源管理器中为项目添加一个Module,保存为Module1。bas,此工程项目的公用模块程序中的过程和函数据如下:
①SQL Server 2000服务器连接字符串函数
Public Function ConnectString() As String
ConnectString = "Provider=SQLOLEDB.1;Password=sa;User ID=sa;Initial Catalog=pubs; Data Source =127.0.0。1”
'设置SQL Server2000数据库链接字符串,此字符串可保存在目录文件中
End Function
②SQL命令执行函数
Public Function ExecuteSQL(ByVal SQL As String, MsgString As String) As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim rst As ADODB。Recordset
Dim sTokens() As String
On Error GoTo ExecuteSQL_Error
sTokens = Split(SQL)
Set cnn = New ADODB.Connection
cnn。Open ConnectString
If InStr("INSERT,DELETE,UPDATE,EXECUTE”, UCase$(sTokens(0))) Then
cnn.Execute (SQL)
MsgString = sTokens(0) & " query successful"
Else
Set rst = New ADODB。Recordset
rst。Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic
Set ExecuteSQL = rst
MsgString = "查询到" & rst。RecordCount & ” 条记录 ”
End If
ExecuteSQL_Exit:
Set rst = Nothing
Set cnn = Nothing
Exit Function
ExecuteSQL_Error:
MsgString = "查询错误: ” & Err.Description
Resume ExecuteSQL_Exit
End Function
这两个函数在后面的实例中将频繁用到,ConnectString函数为连接SQL Server 2000数据库的参数调用函数,为简便起见写在程序中,实际应用中可以把连接数据库的参数保存在配置文件中,通过程序来调用。ExecuteSQL函数执行SQL语句,如删除、更新、添加和查询,只有执行查询语句时才返回记录集对象。
③启动函数SubMain
Sub main()
register。Show
End Sub
系统启动时,首先执行用户登录窗体。
用户管理模块的实现
用户管理模块主要实现对软件的加密,防止盗版,使得软件只能在注册的机器上运行,主要实现生成机器码、用户注册和用户登录验证的功能。所有这些功能在系统的用户登录界面中实现。
1.用户登录窗体的创建
系统启动后,如果未注册,则显示如图14-16所示的窗体,如果注册成功后,将显示如图14—17所示的窗体。两个图中所有控件在同一窗体中,只是在不同的情况下隐藏了相应的控件.
图14-16 未注册时的窗体 图14-17 注册后用户登录窗体
用户登录窗体中放置两个文本框(TextBox),用来输入机器码和注册码;3个按钮(CommandButton)用来进入、注册和退出系统;3个标签(Label)用来显示窗体的信息.这些控件的属性设置见表14-12。
表14-12 登录窗体中各个控件的属性设置
控件
属性
属性取值
说明
Register(Form)
Caption
登录
窗体
StartUpPosition
CenterScreen
窗体显示在屏幕中央
Text1
Name
Text1
机器码文本框
Text2
Name
Text2
注册码文本框
cmdok
Caption
进入
命令按钮
cmdcancel
Caption
退出
退出按钮
cmdenroll
Caption
注册
注册按钮
Label1
Caption
图书现场采购管理系统
提示
Label2
Caption
机器码为:
Label3
Caption
请输入注册码:
此程序在Form_load()实现的代码如下:
Private Sub Form_Load()
Dim machine As String ’机器码
Dim machine_decode As String ’机器码对应的注册码
Dim txtsql As String '用来存放SQL语句
Dim mrc As ADODB.Recordset '用来存放返回记录集对象
Dim msgtext As String '用来存放返回信息
machine = GetSerialNumber("c:") '取硬盘的序列号作为机器码
machine_decode = getserialn() ’取硬盘机器码对应的注册码
text1。Text = machine '在Text1文本框中显示机器码
txtsql = ”select * from userenroll_info where machine=’" & machine & ”' and decode='" & machine_decode & ”'”
Set mrc = ExecuteSQL(txtsql, msgtext) '在用户注册表中查找机器码和注册码
If mrc.EOF Then ’没找到机器注册信息,显示登录界面中的注册框,隐藏进入按钮
' MsgBox ”没有注册信息!”
cmdok。Visible = False
cmdenroll。Visible = True
Else '找到机器注册信息,隐藏登录界面中的注册框,显示进入按钮
'MsgBox ”找到注册信息"
cmdok。Visible = True
cmdenroll。Visible = False
Label2。Visible = False
Label3。Visible = False
text1.Visible = False
text2.Visible = False
End If
Set mrc = Nothing
End Sub
Private Sub cmdok_Click() '验证成功时进入系统
Unload Me
frmmain.Show
End Sub
Private Sub cmdcancel_Click() ’退出系统
End
End Sub
2.生成机器码函数
Function GetSerialNumber(strDrive As String) As Long
’获取机器码函数,取硬盘的序列号
Dim SerialNum As Long
Dim Res As Long
Dim Temp1 As String
Dim Temp2 As String
Temp1 = String$(255, Chr$(0))
Temp2 = String$(255, Chr$(0))
Res = GetVolumeInformation(strDrive, Temp1, _
Len(Temp1), SerialNum, 0, 0, Temp2, Len(Temp2))
GetSerialNumber = —SerialNum
End Function
Function getserialn() As String
’获取机器码对应的注册码,对硬盘的序列号(机器码)进行变换,转为注册码
Dim inputseial As String
Dim n As String
Dim n1 As String
Dim n2 As String
Dim p As Long
Dim p1 As Long
Dim p2 As Long
Dim i As Long
p = 0
p1 = 0
p2 = 0
n = ””
n1 = ””
n2 = "”
n = Str(GetSerialNumber("c:"))
n1 = n
n2 = n
If Len(n) < 20 Then
n = n + String(20 — Len(n), ”Z”)
n1 = n1 + String(20 — Len(n1), ”A”)
n2 = n2 + String(20 - Len(n2), "H")
ElseIf Len(n) > 20 Then
n = Left(n, 20)
n1 = Left(n1, 20)
n2 = Left(n2, 20)
End If
For i = 1 To 20
p = p + Asc(Mid(n, i, 1)) * 199
p1 = p1 + Asc(Mid(n1, i, 1)) * 179
p2 = p2 + Asc(Mid(n2, i, 1)) * 109
Next
inputseial = Format(p) + ”—” + Format(p1) + ”-" + Format(p2)
getserialn = inputseial
End Function
在GetSerialNumber()函数中需要调用API函数GetVolumeInformation()来获取盘区信息,其中卷序列号也就是磁盘每个分区的序列号,此函数需在用户登录窗体中申明,函数格式如下。
Private Declare Function GetVolumeInformation Lib _
"kernel32。dll" Alias "GetVolumeInformationA" (ByVal _
lpRootPathName As String, ByVal lpVolumeNameBuffer As _
String, ByVal nVolumeNameSize As Integer, _
lpVolumeSerialNumber As Long, lpMaximumComponentLength _
As Long, lpFileSystemFlags As Long, ByVal _
lpFileSystemNameBuffer As String, ByVal _
nFileSystemNameSize As Long) As Long ’ 取硬盘卷信息的动态链接库
此函数不需要手工输入,可通过VB工具“API文本浏览器”获取,在Windows桌面选择“开始→程序→ Microsoft Visual Basic 6.0中文版→ Microsoft Visual Basic 6。0中文版工具→API文本浏览器”选项,打开API阅览器如下图14—18所示。从“文件”菜单中选择“加载文本文件”菜单项,加载WIN32API。TXT文本文件,此时在“可用项”中选择“GetVolumeInformation”并双击,则此函数的声明显示在“选定项”文本框中,此时可将此函数复制用户管理窗体中。
图14-18 API文本浏览器
3.用户注册程序
如果用户第一次登录,则应在文本框(text2)中输入从软件商处取得的注册码,进行注册,执行cmdenroll_Click程序后,将机器码和注册码写入SQL Server 2000数据库中。
Private Sub cmdenroll_Click()
'在text2中输入软件商所提供的注册码,写入数据库的userenroll_info表中
Dim txtsql As String ’用来存放SQL语句
Dim mrc As ADODB。Recordset ’用来存放返回记录集对象
Dim msgtext As String '用来存放返回信息
If Len(text2.Text) 〈〉 20 Then
MsgBox "您输入的注册码错误!”
Exit Sub
End If
If text2.Text 〈〉 getserialn() Then
MsgBox ”注册码错误,请重新输入!”
Exit Sub
End If
'注册码输入正确,写入数据库,同时显示进入按钮,隐藏注册对象。
On Error GoTo err1
txtsql = ”INSERT INTO userenroll_info (machine,decode) values (’” & text1。Text & "’,'” & text2.Text & "’)”
Set mrc = ExecuteSQL(txtsql, msgtext) ’在用户注册表中查找机器码和注册码
MsgBox ”注册成功!"
cmdok.Visible = True
cmdenroll.Visible = False
Label2.Visible = False
Label3。Visible = False
text1.Visible = False
text2.Visible = False
Exit Sub
err1:
MsgBox "添加注册信息失败!”
End Sub
采购数据管理模块的实现
采购数据管理模块主要实现如下功能:添加采购信息、修改采购信息、和查询采购信息。
1.添加采购信息窗体的创建
选择“采购数据处理→采购数据添加"菜单,将出现如图14-19所示的窗体.
图14—19 添加采购数据窗体
在窗体中放置了多个文本框,用来输入图书及采购信息;两个命令按钮用来确定添加采购信息和退出;加入多个标签用来提示文本框内容.这些控件的属性设置如表14—13所示.
表14-13 添加采购信息窗体中各控件的属性设置
控件
属性
属性值
说明
Frmxjadd(Form)
Name
frmxjadd
当前窗体
Caption
采购数据添加
Text1
Name
Text1
输入ISBN号文本框
Text2
Name
Text2
输入书名文本框
Text3
Name
Text3
输入分类文本框
Text4
Name
Text4
输入出版社文本框
Text5
Name
Text5
输入作者文本框
Text6
Name
Text6
输入价格文本框
Text7
Name
Text7
输入出版年文本框
Text8
Name
Text8
输入订购数量文本框
Text9
Name
Text9
输入提供商文本框
cmdxjadd
Name
cmdxjadd
添加命令按钮
cmdexit
Name
cmdexit
退出命令按钮
Label1
Caption
ISBN号:
提示标签
Label2
Caption
书名:
Label3
Caption
分类:
Label4
Caption
出版社:
Label5
Caption
作者:
Label6
Caption
价格:
Label7
Caption
出版年:
Label8
Caption
订购数:
Label9
Caption
提供商:
用户输入完采购图书的基本信息后,单击“添加”按钮将触发cmdxjadd_Click事件,代码如下:
Dim mrc As ADODB。Recordset '定义数据集对象
Dim txtsql As String ’定义查询字符串变量
Dim msgtext As String ’定义字符串变量,用来返回查询信息
’判断是否输入了ISBN号
If Trim(Text1.Text) = ”” Then
MsgBox ”请输入ISBN号”, vbOKOnly, ”警告"
Text1。SetFocus
Exit Sub
End If
'判断是否输入了书名
If Text2.Text = ”” Then
MsgBox ”请输入书名”, vbOKOnly, ”警告”
Text2。SetFocus
Exit Sub
End If
’判断是否输入了出版社
If Text4。Text = "” Then
MsgBox "请输入出版社”, vbOKOnly, ”警告”
Text4。SetFocus
Exit Sub
End If
'判断是否输入了价格
If Text6。Text = "" Then
MsgBox ”请输入订价", vbOKOnly, ”警告”
Text6。SetFocus
Exit Sub
End If
'判断输入的价格是不是数值
If Not IsNumeric(Text6.Text) Then
MsgBox "价格输入不为数字!"
Text6.SetFocus
Exit Sub
End If
’判断是否输入了订购数
If Text8。Text = "” Then
MsgBox ”请输入订购数量", vbOKOnly, "警告"
Text8.SetFocus
Exit Sub
End If
'判断输入的订购数是不是数值
If Not IsNumeric(Text8.Text) Then
MsgBox ”订购数输入不为数字!"
Text8。SetFocus
Exit Sub
End If
’添加数据到SQL Server 2000数据库中
txtsql = ”select * from bookseller_bookinfo"
Set mrc = ExecuteSQL(txtsql, msgtext)
'添加一条记录进入数据库中
mrc.AddNew
mrc.Fields(”isbn") = Trim(Text1。Text)
mrc。Fields(”bookname”) = Trim(Text2。Text)
mrc。Fields(”class_name”) = Trim(Text3。Text)
mrc。Fields(”publisher") = Trim(Text4。Text)
mrc.Fields("author”) = Trim(Text5。Text)
mrc.Fields("book_price”) = Trim(Text6。Text)
mrc.Fields("publisher_date") = Val(Trim(Text7.Text))
mrc。Fields(”book_num") = Val(Trim(Text8。Text))
mrc。Fields(”provider”) = Trim(Text9.Text)
mrc。Update
MsgBox ”添加数据成功", vbOKOnly, "提示"
mrc。Close
End Sub
程序对是否输入了内容进行判断,同时进行了数值数据判断,使用了IsNumeric()函数,判断了价格和订购数量是不是数值。单击“退出"按钮触发cmdexit_Click事件,代码如下:
Private Sub cmdexit_Click()
Unload Me ’卸载窗体
End Sub
2.修改采购信息窗体的创建
选择“采购数据处理→采购数据修改”菜单,将出现如图14-20所示的窗体.这个窗体包括了采购信息的修改和删除,在上面用户管理和采购数据添加中对SQL Server 2000数据库的操作是通过ADO对象模型的引用来实现。下面在采购信息的修改中将采用ADO控件来实现。
在修改采购信息窗体中所有控件的属性设置如表14—14所示。
图14-20 修改采购信息窗体
表14—14 修改采购信息窗体中各个控件的属性设置
控件名称
属性
属性值
说明
Frmxjmodify(form)
name
frmxjmodify
窗体
caption
修改采购信息
ADODC1
name
ADODC1
ADO控件
visible
False
不可见
CommandType
2-adCmdTable
表
ConnectionString
Provider=SQLOLEDB。1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs;Data Source=127。0.0。1
数据库连接字符串
RecordSource
bookseller_bookinfo
采购数据表
UserName
sa
Password
sa
Text1
name
Text1
书名文本框
DataSource
Adodc1
数据源
DataField
bookname
字段名
Text2
name
Text2
ISBN文本框
DataSource
Adodc1
DataField
isbn
Text3
name
Text3
作者文本框
DataSource
Adodc1
DataField
author
Text4
name
Text4
出版社文本框
DataSource
Adodc1
DataField
publisher
Text5
name
Text5
出版年文本框
DataSource
Adodc1
DataField
Publisher_date
Text6
name
Text6
价格文本框
DataSource
Adodc1
DataField
price
Text7
name
Text7
分类文本框
DataSource
Adodc1
DataField
Class_name
Text8
name
Text8
选购数量文本框
DataSource
Adodc1
DataField
Book_num
Text9
name
Text9
提供商文本框
DataSource
Adodc1
DataField
provider
Command1
Name
Command1
第一条
Command2
Name
Command2
上一条
Command3
Name
Command3
下一条
Command4
Name
Command4
最后一条
Command5
Name
Command5
更新记录
Command6
Name
Command6
取消更新
Command7
Name
Command7
删除记录
Command8
Name
Command8
退出
各命令按钮触发相应的事件,程序代码如下:
Private Sub Command1_Click()
'指针移到第一条记录
Adodc1.Recordset。MoveFirst
End Sub
Private Sub Command2_Click()
'指针移到上一条记录,如果记录指针移到BOF,则记录指针指到第一条,并给出提示
Adodc1.Recordset.MovePrevious
If Adodc1.Recordset。BOF Then
Adodc1.Recordset.MoveFirst
MsgBox ”已到第一条记录!"
End If
End Sub
Private Sub Command3_Click()
'指针移到下一条,如果记录指针移到EOF,则记录指针指到最后一条,并给出提示
Adodc1。Recordset.MoveNext
If Adodc1.Recordset.EOF Then
Adodc1。Recordset。MoveLast
MsgBox "已到最后一条记录”
End If
End Sub
Private Sub Command4_Click()
’记录指针指到最后一条
Adodc1。Recordset。MoveLast
End Sub
Private Sub Command5_Click()
'更新当前记录
Dim bookmark As Variant '定义书签,记录当前记录的位置
bookmark = Adodc1。Recordset。bookmark
If Trim(Text1。Text) = "” Then '判断修改后的书名是否为空
MsgBox ”书名不能为空!", vbOKOnly, ”警告"
Adodc1。Refresh '数据库中的数据刷新文本框
Adodc1。Recordset。bookmark = bookmark '回到要修改记录位置
Text1.SetFocus
Exit Sub
End If
If Trim(Text2。Text) = "" Then '判断修改后的ISBN信息是否为空
MsgBox ”ISBN信息不能为空!", vbOKOnly, ”警告"
Adodc1.Refresh
Adodc1。Recordset.bookmark = bookmark
Text2。SetFocus
Exit Sub
End If
'判断输入的价格是不是数值
If Not IsNumeric(Text6.Text) Then
MsgBox ”价格不为数字!”
Text6。SetFocus
Exit Sub
End If
’判断输入的订购数是不是数值
If Not IsNumeric(Text8。Text) Then
MsgBox "订购数量修改不为数字!”
Text8。SetFocus
Exit Sub
End If
’更新当前记录
Adodc1。Recordset.Update
MsgBox ”当前记录已更新!", vbOKOnly, ”提示"
End Sub
Private Sub Command7_Click()
'删除当前记录
Adodc1。Recordset.Delete
Adodc1.Recordset.MoveFirst
MsgBox ”当前记录已删除!", vbOKOnly, "提示”
End Sub
Private Sub Command8_Click()
’退出
Unload Me
End Sub
Private Sub Command6_Click()
'取消更新
Dim bookmark As Variant
bookmark = Adodc1。Recordset。bookmark
Adodc1.Refresh
Adodc1。Recordset。bookmark = bookmark
End Sub
3.查询采购信息窗体的创建
选择“采购数据处理→采购数据查询”菜单,进入如图14-21所示的窗体。可以按ISBN号、书名、作者、出版社、出版年、分类和提供商进行查询以及各字段的排序。
图14—21 采购数据查询窗体
在采购信息查询窗体中用到了一个DataGrid控件,需在VB中选择“工程→部件”菜单打开的对话框中选择“MicroSoft DataGrid Controls 6.0 (OLEDB)”组件加入。查询窗体中所包含的控件及其属性如表14—15。
表14—15 查询采购信息窗体中各个控件及属性设置
控件
属性
属性值
说明
Frmxjquery(Form)
name
frmxjquery
采购数据查询窗体
Caption
采购数据查询
Adodc1
name
Adodc1
ADO数据连接控件
ConnectionString
Provider=SQLOLEDB。1;Persist Security Info=False;User ID=sa;Initial Catalog=pubs;Data Source=127.0。0.1
CommandType
1-adCmdText
SQL语句
RecordSource
select * from bookseller_info
Username
sa
Password
sa
DataGrid1
Name
DataGrid1
数据网格控件
DataSource
Adodc1
Combo1
Na
展开阅读全文