1、),machine varchar(50) null,decode varchar(50) null2系统主窗体的创建 上面的SQL语句在SQL Server 2000中查询分析器执行后,将自动产生需要的所有表。有关数据结构的所有后端工作已经完成。现在将通过图书现场采购系统中功能模块的实现,介绍如何使用Visual Basic来编写数据库系统的客户端程序。(1)创建工程项目BOOKCG_MIS启动VB,在VB工程模板中选择“标准 EXE,VB将自动产生一个Form窗体,这里删除这个窗体。单击“文件保存工程”菜单项,保存工程,将这个工程命名为BookCG_MIS。vbp。(2)创建图书现场采购管
2、理系统主窗体Visual Basic创建的应用程序可以是SDI(单文档界面)和MDI(多文档界面)。这里采用MDI多文档界面,可以使程序更为美观、整齐有序。单击工具栏中的“添加MDI窗体”按钮,添加一个多文档界面,后单击工具栏中的“菜单编辑器”创建主窗体的菜单,生成一个如图14-15所示的主窗体,主窗体的Caption属性设为“图书现场采购管理系统”,Name属性为“frmmain”。主窗体保存文件名为frmmain。frm.菜单结构参考图14-12。图1415 系统主窗体(3)创建公用模块在Visual Basic中可以用公用模块来存放整个工程项目公用的函数、全局变量等.便于各窗体模块调用公
3、用模块中的函数、变量,以提高代码的效率。在项目资源管理器中为项目添加一个Module,保存为Module1。bas,此工程项目的公用模块程序中的过程和函数据如下:SQL Server 2000服务器连接字符串函数Public Function ConnectString() As StringConnectString = Provider=SQLOLEDB.1;Password=sa;User ID=sa;Initial Catalog=pubs; Data Source =127.0.0。1” 设置SQL Server2000数据库链接字符串,此字符串可保存在目录文件中End Functi
4、onSQL命令执行函数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,
5、DELETE,UPDATE,EXECUTE”, UCase(sTokens(0) Then cnn.Execute (SQL) MsgString = sTokens(0) & query successful Else Set rst = New ADODB。 rst。Open Trim$(SQL), cnn, adOpenKeyset, adLockOptimistic Set ExecuteSQL = rst MsgString = 查询到 rst。RecordCount ” 条记录 ” End IfExecuteSQL_Exit: Set rst = Nothing Set cnn =
6、 Nothing Exit FunctionExecuteSQL_Error:查询错误: ” & Err.Description Resume ExecuteSQL_Exit这两个函数在后面的实例中将频繁用到,ConnectString函数为连接SQL Server 2000数据库的参数调用函数,为简便起见写在程序中,实际应用中可以把连接数据库的参数保存在配置文件中,通过程序来调用。ExecuteSQL函数执行SQL语句,如删除、更新、添加和查询,只有执行查询语句时才返回记录集对象。启动函数SubMainSub main() register。ShowEnd Sub系统启动时,首先执行用户登录
7、窗体。用户管理模块的实现用户管理模块主要实现对软件的加密,防止盗版,使得软件只能在注册的机器上运行,主要实现生成机器码、用户注册和用户登录验证的功能。所有这些功能在系统的用户登录界面中实现。1用户登录窗体的创建系统启动后,如果未注册,则显示如图14-16所示的窗体,如果注册成功后,将显示如图1417所示的窗体。两个图中所有控件在同一窗体中,只是在不同的情况下隐藏了相应的控件. 图14-16 未注册时的窗体 图14-17 注册后用户登录窗体用户登录窗体中放置两个文本框(TextBox),用来输入机器码和注册码;3个按钮(CommandButton)用来进入、注册和退出系统;3个标签(Label)
8、用来显示窗体的信息.这些控件的属性设置见表14-12。表14-12 登录窗体中各个控件的属性设置控件属性属性取值说明Register(Form)Caption登录窗体StartUpPositionCenterScreen窗体显示在屏幕中央Text1Name机器码文本框Text2注册码文本框cmdok进入命令按钮cmdcancel退出退出按钮cmdenroll注册注册按钮Label1图书现场采购管理系统提示Label2机器码为:Label3请输入注册码:此程序在Form_load()实现的代码如下:Private Sub Form_Load() Dim machine As String 机器码
9、 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_i
10、nfo 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 ”找到注册信息 Label2。 Label3。 text1.Visible
11、 = False text2.Visible = False Set mrc = NothingPrivate Sub cmdok_Click() 验证成功时进入系统 Unload Me frmmain.ShowPrivate Sub cmdcancel_Click() 退出系统End2生成机器码函数Function GetSerialNumber(strDrive As String) As Long获取机器码函数,取硬盘的序列号 Dim SerialNum As Long Dim Res As Long Dim Temp1 As String Dim Temp2 As String Tem
12、p1 = String$(255, Chr(0) Temp2 = String(255, Chr(0) Res = GetVolumeInformation(strDrive, Temp1, _ Len(Temp1), SerialNum, 0, 0, Temp2, Len(Temp2) GetSerialNumber = SerialNumFunction getserialn() As String获取机器码对应的注册码,对硬盘的序列号(机器码)进行变换,转为注册码 Dim inputseial As String Dim n As String Dim n1 As String Dim
13、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) n = Left(n, 20) n1 = Left(n1, 20) n2 = Left(n2, 20) For i = 1 To 20 p = p + Asc(Mid(n, i, 1) 199 p1 = p1 + Asc(Mid(n1, i, 1) 179 p2 = p2 +
14、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 GetVolu
15、meInformationA (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 L
16、ong 取硬盘卷信息的动态链接库此函数不需要手工输入,可通过VB工具“API文本浏览器”获取,在Windows桌面选择“开始程序 Microsoft Visual Basic 6.0中文版 Microsoft Visual Basic 6。0中文版工具API文本浏览器”选项,打开API阅览器如下图1418所示。从“文件”菜单中选择“加载文本文件”菜单项,加载WIN32API。TXT文本文件,此时在“可用项”中选择“GetVolumeInformation”并双击,则此函数的声明显示在“选定项”文本框中,此时可将此函数复制用户管理窗体中。图14-18 API文本浏览器3用户注册程序 如果用户第一
17、次登录,则应在文本框(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
18、SubEnd IfIf text2.Text getserialn() Then MsgBox ”注册码错误,请重新输入!注册码输入正确,写入数据库,同时显示进入按钮,隐藏注册对象。On Error GoTo err1txtsql = ”INSERT INTO userenroll_info (machine,decode) values (” text1。Text ,” & text2.Text &)”Set mrc = ExecuteSQL(txtsql, msgtext) 在用户注册表中查找机器码和注册码MsgBox ”注册成功! cmdok.Visible = True cmdenro
19、ll.Visible = False Label2.Visible = FalseExit Suberr1:MsgBox 添加注册信息失败!采购数据管理模块的实现采购数据管理模块主要实现如下功能:添加采购信息、修改采购信息、和查询采购信息。1添加采购信息窗体的创建选择“采购数据处理采购数据添加菜单,将出现如图14-19所示的窗体.图1419 添加采购数据窗体在窗体中放置了多个文本框,用来输入图书及采购信息;两个命令按钮用来确定添加采购信息和退出;加入多个标签用来提示文本框内容.这些控件的属性设置如表1413所示.表14-13 添加采购信息窗体中各控件的属性设置属性值Frmxjadd(Form)
20、frmxjadd当前窗体采购数据添加输入ISBN号文本框输入书名文本框Text3输入分类文本框Text4输入出版社文本框Text5输入作者文本框Text6输入价格文本框Text7输入出版年文本框Text8输入订购数量文本框Text9输入提供商文本框cmdxjadd添加命令按钮cmdexit退出命令按钮ISBN号:提示标签书名:分类:Label4出版社:Label5作者:Label6价格:Label7出版年:Label8订购数:Label9提供商:用户输入完采购图书的基本信息后,单击“添加”按钮将触发cmdxjadd_Click事件,代码如下: Dim mrc As ADODB。Recordse
21、t 定义数据集对象 Dim txtsql As String 定义查询字符串变量 Dim msgtext As String 定义字符串变量,用来返回查询信息 判断是否输入了ISBN号 If Trim(Text1.Text) = ” Then MsgBox ”请输入ISBN号”, vbOKOnly, ”警告 Text1。SetFocus判断是否输入了书名 If Text2.Text = ” Then MsgBox ”请输入书名”, vbOKOnly, ”警告” Text2。 判断是否输入了出版社 If Text4。Text = ” Then请输入出版社”, vbOKOnly, ”警告” Tex
22、t4。判断是否输入了价格 If Text6。 Then MsgBox ”请输入订价, vbOKOnly, ”警告” Text6。判断输入的价格是不是数值 If Not IsNumeric(Text6.Text) Then价格输入不为数字! Text6.SetFocus 判断是否输入了订购数 If Text8。 MsgBox ”请输入订购数量, vbOKOnly, 警告 Text8.SetFocus判断输入的订购数是不是数值 If Not IsNumeric(Text8.Text) Then MsgBox ”订购数输入不为数字! Text8。 添加数据到SQL Server 2000数据库中 t
23、xtsql = ”select * from bookseller_bookinfo Set mrc = ExecuteSQL(txtsql, msgtext)添加一条记录进入数据库中mrc.AddNew mrc.Fields(”isbn) = Trim(Text1。Text) mrc。Fields(”bookname”) = Trim(Text2。Fields(”class_name”) = Trim(Text3。Fields(”publisher) = Trim(Text4。 mrc.Fields(author”) = Trim(Text5。book_price”) = Trim(Text6。publisher_date) = Val(Trim(Text7.T