ASP.NET数据存储与交换系统设计

摘  要

该系统以Microsoft Visual Studio 2003作为开发工具,选用SQL Server 2000数据库来实现数据存储,并设计开发了一种基于B/S模式的数据存储与交换系统。该系统完成了用户注册管理、后台管理和用户空间管理功能;为每个用户提供了个人的存储空间;用户可以通过浏览器实现文件的上传、下载和资源的共享;根据用户空间等级限制用户存储空间的大小;为用户共享文件提供积分制;通过积分制来对用户空间升级实行优惠。最后通过测试,基本满足了用户的需求,但还需要进一步完善,才可以应用于实际中。

关键词网络存储;上传下载;资源共享

2 系统需求分析

该系统功能要求如下:

(1) 用户管理:用户注册、注册审核、用户存储空间限定管理、用户积分、用户等级

(2) 存储管理:为用户提供基于B/S模式的上传和下载数据,数据为现有的个人用户文件,为用户提供存储文件的添加、修改、删除操作。

(3) 收费管理:按照空间大小收费、根据用户的积分、等级实施优惠收费,为用户提供共享的文件提供积分累计。

(4) 数据共享管理:数据共享文件管理。

5 系统模块代码实现

根据系统功能设计,将整个系统划分为以下几个功能模块。

5.1 用户登录模块

用户登录界面(Default.aspx)是起始界面,必须登录后才可以进行其他的操作。首先通过输入用户名和密码,然后在用户信息表Users中查询输入的用户名和密码两个字段是否有相匹配的数组,如果没有则提示“用户不存在或密码错误!”,返回登录界面;如果登录成功则将用户名赋给Session,然后自动跳转到用户主界面。其中登录Button的触发主要代码如下:

        conn.ConnectionString = "Data Source=86BC14A814F7477;Initial Catalog=NWMS;User ID=sa;Password=123"

        conn.Open()

        cmd.Connection = conn ‘连接数据库

        cmd.CommandText = "Select * From Users"

        objReader = cmd.ExecuteReader()

        Do While objReader.Read()

            If UserId.Text = objReader.Item("UserId") And UserPwd.Text = objReader.Item("UserPwd") Then

'在数据库Users表中搜寻与输入的用户名和密码相匹配的数组

                Session("UserId") = UserId.Text'将用户名赋给Session

                Response.Redirect("User0.aspx") '登录成功跳转页面

                Exit Do

            End If

        Loop

        Response.Write("<script>alert('用户不存在或密码错误!')</script>")

        objReader.Close()

        conn.Close()'断开数据库连接

5.2 用户注册模块

用户注册页面(Reg.aspx),文本框后带**的为必填,其他选填,用户注册时必须输入用户名、密码、密码确认、密码提示问题、密码提示答案和电子邮箱,否则不能注册。当这些都满足后点击注册,触发事件代码开始搜索用户信息表(Users),检验是否存在相同用户名,如存在,那么提示“该用户已经注册!”,退回注册页面,主要代码如下:

        cmd.CommandText = "Select UserId From Users"

        objReader = cmd.ExecuteReader()

        Do While objReader.Read()

            If UserIdBox.Text = objReader.Item("UserId") Then

                Response.Write("<script>alert('该用户已经注册!')</script>") '验证用户名

                i = 1

                Exit Do

            End If

        Loop

        objReader.Close()

如果未发现相同用户名,则用SQL语句INSERT将新用户信息写入用户信息表Users,同时运用MkDir( )在服务器系统目录的myfile文件夹内新建一个文件夹,用户名即为文件夹名。同时将用户等级类型设定为“1”,即普通用户,享有空间大小为50MB;将用户锁定类型设为空,即默认未锁;将用户积分等级设为0,刚注册用户对未共享过任何文件,未为资源共享做贡献,所以不具有收费优惠。主要代码如下:

            cmd.CommandText = "INSERT INTO Users(UserId,UserPwd,PwdQuestion,PwdAnwser,Email,Ser,QQ,UserName,Telephone,vUserRank,vRegDate,vUserLock,vContrbRank,UserIn,vUserSore) VALUES('" & UserIdBox.Text & "','" & UserPwdBox.Text & "','" & TextBox1.Text & "','" & TextBox2.Text & "','" & TextBox3.Text & "','" & ser & "','" & TextBox4.Text & "','" & TextBox5.Text & "','" & TextBox6.Text & "' ,'" & 1 & "','" & Today & "' ,'" & "" & "','" & "" & "','" & "" & "','" & "" & "')"

            If cmd.ExecuteNonQuery > 0 Then

                Dim filepath As String = Path.Combine(Server.MapPath(".") & "\myfile", UserIdBox.Text)

                MkDir(filepath) '新建个人文件夹,文件名为用户名

                Response.Write("<script language=javascript>alert('注册成功!');window.location='Default.aspx';</script>")

            End If

5.3 用户主界面模块

用户主界面(User0.aspx)采用分页技术显示,主要有上和左、右3部分。左边固定显示LeftTree.aspx页面,主要给用户提供操作链接,通过点击左边的链接(包括有:文件管理、文件上传、我的共享、公共共享、空间升级、空间信息、个人资料和退出系统),将相应的操作页面在右边显示出来,右边的初始页面为用户个人空间信息页面(Spatial_inon.aspx),具体界面如图2。

图2 用户主界面操作图

5.4 文件存储管理模块

在主界面左边的链接中点击“文件管理”连接到文件管理页面(File_mgt.aspx),该页面利用DataGrid的强大显示功能为用户显示了当前用户所上传的所有文件,并可以对任何一个文件通过“编辑”超链接到编辑页面(File_edit.aspx)进行共享和文件名的修改;还可以通过点击文件名下载当前文件,还可以通过点击删除,删除相应行文件信息和文件(删除文件运用的是Kill( ))。主要代码如下:

(1) 初始化页面和声明绑定数据过程Bind()主要代码如下:

        If Not (Me.IsPostBack) Then

            Me.Bind()

        End If

    Sub Bind()

        Dim userid As String = Session("UserId")

        Sql = "Select * From UserFiles WHERE UserId='" & userid & "'"

        cnSqlServer = "Data Source=86BC14A814F7477;Initial Catalog=NWMS;User ID=sa;Password=123"

        Dim objAdapter As New SqlDataAdapter(Sql, cnSqlServer)

        objAdapter.Fill(ds, "UserFiles")

        DataGrid.DataSource = ds

        DataGrid.DataBind()

        conn.Close()

        conn.Dispose()

    End Sub

(2) 点击文件名触发下载文件事件的主要代码如下:

            Dim fileW As String = e.Item.Cells(0).Text

            Dim filepath As String = Server.MapPath(fileW)

            Dim filename As String = System.IO.Path.GetFileName(filepath)

            Response.Clear()

            Response.ContentType = "application/octet-stream"

            Response.AppendHeader("Content-Disposition", "attachment;filename=" + filename)

            Response.Flush()

            Response.WriteFile(filepath)

(3) 点击删除时,删除当前行文件和文件信息,主要代码如下:

            Dim Sql As String = "Delete UserFiles WHERE vWay=@vWay"

            Dim cmd As New SqlCommand(Sql, conn)

            cmd.Parameters.Add(New SqlParameter("@vWay", SqlDbType.VarChar, 50))

            cmd.Parameters("@vWay").Value = e.Item.Cells(0).Text

            conn.Open()

            cmd.ExecuteNonQuery()

            Dim pathname As String = Path.Combine(Server.MapPath("."), e.Item.Cells(0).Text)

            Kill(pathname)

            conn.Close()

            cmd.Dispose()

            conn.Dispose()

            Me.Bind()

(4) 点击datagrid控件中的超链接列“编辑”,连接到相应文件编辑页面(File_edit.aspx=?file={0}),通过file将相应行的文件路径值传给文件编辑页面,文件编辑主要代码如下:

  1. 初始化页的代码如下:

        Way = Request.QueryString("file") '获取传值

        If Not (Me.IsPostBack) Then

            FileName.Text = Path.GetFileNameWithoutExtension(Way) '从路径中获取不含扩展名的用户名

        End If

  1. 修改Button触发的事件主要代码如下:

        Dim FileNameW As String = FileName.Text '获取TextBox的控件中的用户名

        Dim FileNameE As String = Path.GetExtension(Way)'从路径中提取文件扩展名

        Dim FileNameA As String = FileNameW & FileNameE '合并两字符串

        Dim FilenewWay As String = Path.Combine(Path.GetDirectoryName(Way), FileNameA) '合并两路径字符串,合并成新路径

        Dim pathnameO As String = Path.Combine(Server.MapPath("."), Way)

        Dim pathnameN As String = Path.Combine(Server.MapPath("."), FilenewWay)

        '更新数据库数据表中的文件信息

        cmd.CommandText = "UPDATE UserFiles SET vWay='" & FilenewWay & "', vUpDate='" & Now & "',vFileName='" & FileNameA & "',vSharType='" & type & "' WHERE vWay='" & Way & "'"

        n = cmd.ExecuteNonQuery()

        Rename(pathnameO, pathnameN)'修改相对应的文件的文件名

5.5 文件上传模块

在主界面左边的链接中或文件管理页面的右上角点击“文件上传”就链接到文件上传页面(upload.aspx),该页面用File Field控件完成文件上传,通过上传代码“FileUpload.PostedFile.SaveAs( )”将文件上传保存到用户个人文件夹下面,并将文件信息写如数据库UserFiles表。上传之前判定控件内是否存在上传文件地址,如果没有则提示“未发现文件。”,如果有则继续下步,搜索用户已经上传文件的总大小,加上当前将要上传的文件大小之和,判断其是否超过用户等级限定的空间大小,如果超过,则弹出对话框“你的空间不足!”;如果未超过,表示还可以上传,再检测上传空间内是否存在相同文件名(包括扩展名),如果有则将文件覆盖,修改文件保存相关信息提示“XX文件被覆盖”,如果没有则提示“XX文件成功上传到服务器”,保存文件相关信息和文件。主要代码如下:

        Dim userid As String = Session("UserId")

        FileNname = Path.GetFileName(FileUpload.Value) '提取控件路径中的文件名

        FileUname1 = Path.Combine("myfile", userid)

        FileUname = Path.Combine(Server.MapPath("."), FileUname1) '获得了文件上传目录

        FileNewW = Path.Combine(FileUname1, FileNname)

        Filepath = Path.Combine(FileUname, FileNname)

        FileNewl = FileUpload.PostedFile.ContentLength

        FileNewlB = ConvertBytes(FileNewl)

(1) 统计已用空间大小主要代码如下:

            cmd.CommandText = “Select UserId From UserFiles”

            objReader = cmd.ExecuteReader()

            Do While objReader.Read()

                If userid = objReader.Item(“UserId”) Then

                    objReader.Close()

                    cmd.CommandText = “Select SUM(vFileSb) From UserFiles WHERE UserId=’” & userid & “’”

                    objReader = cmd.ExecuteReader()

                    objReader.Read()

                    FileOldl = objReader.Item(0)  ‘统计用户空间文件大小

                    Exit Do

                End If

            Loop

(2) 获得用户空间大小主要代码如下:

            cmd.CommandText = “SELECT vUserRank From Users WHERE UserId= ‘” & userid & “’”

            objReader = cmd.ExecuteReader

            objReader.Read()

            UserRank = objReader.Item(0) ‘获得用户等级

            objReader.Close()

            cmd.CommandText = “SELECT vSpaceSb From UsersRank WHERE vIserRank=’” & UserRank & “’”

            objReader = cmd.ExecuteReader

            objReader.Read()

            SpaceSb = objReader.Item(0) ‘获得用户相应等级空间

            objReader.Close()

            If FileSuml < SpaceSb Then

                cmd.CommandText = “SELECT vWay FROM UserFiles”

                objReader = cmd.ExecuteReader()

                Do While objReader.Read()

                    If FileNewW = objReader.Item(“vWay”) Then

                        I = 1 ‘搜寻用户空间中是否存在相同文件名

                        Exit Do

                    End If

                Loop

(3) 如空间内没有相同文件,则主要代码如下:

                    cmd.CommandText = “INSERT INTO UserFiles(UserId,vFileSize,vFileSb,vFileName,vWay,vSharType,vUpDate,vDownCount,vFileLock,vFileUp) VALUES(‘” & userid & “’,’” & FileNewlB & “’,’” & FileNewl & “’,’” & FileNname & “’,’” & FileNewW & “’,’” & “不共享” & “’,’” & Now & “’,’” & “” & “’,’” & “” & “’,’” & “” & “’)”

                    n = cmd.ExecuteNonQuery

                    FileUpload.PostedFile.SaveAs(Filepath) ‘上传文件到指定目录  

                    lblMessage.InnerHtml = “文件 <b>” & FileNname & “</b>成功上传到服务器,大小为” & FileNewlB

(4) 如空间有相同文件,则主要代码如下:

                    cmd.CommandText = "UPDATE UserFiles SET vFileSize='" & FileNewlB & "',vFileSb='" & FileNewl & "',vUpDate='" & Now & "',vDownCount='" & "" & "',vFileLock='" & "" & "',vFileUp='" & "" & "' WHERE vWay='" & FileNewW & "'"

                    n = cmd.ExecuteNonQuery

                    FileUpload.PostedFile.SaveAs(Filepath) '上传文件到指定目录

                    lblMessage.InnerHtml = "文件 <b>" & FileNname & "</b>被覆盖,大小为" & FileNewlB

(5) 自定义一个换算字符长度的Function代码如下:

    Public Function ConvertBytes(ByVal Bytes As Long) As String

        ' 将过大字符长度由Byte转化为GB、MB、KB表示

        If Bytes >= 1073741824 Then

            Return Format(Bytes / 1024 / 1024 / 1024, "#0.00") & " GB"

        ElseIf Bytes >= 1048576 Then

            Return Format(Bytes / 1024 / 1024, "#0.00") & " MB"

        ElseIf Bytes >= 1024 Then

            Return Format(Bytes / 1024, "#0.00") & " KB"

        ElseIf Bytes > 0 And Bytes < 1024 Then

            Return Fix(Bytes) & " Bytes"

        Else

            Return "0 Bytes"

        End If

    End Function

5.6 我的共享查询模块

在主界面左边的链接中点击“我的共享”就链接到我的共享查询页面(Myshar.aspx),该模块也采用DateGrid控件显示个人已经共享的文件的信息,你可以从中看到你所共享的文件被下载次数,是否被管理员锁定,还可点击相应行后边的取消直接取消共享。如果锁定栏下有“√”符号,那么证明你所共享的文件被别人举报,经过管理员核查属于不合适文件,它将不会再被显示到共享区域。主要代码如下:

(1) 绑定数据库主要代码:

        Sql = "Select * From UserFiles WHERE UserId='" & userid & "' AND vSharType='" & "共享" & "' ORDER BY vDownCount DESC"

        cnSqlServer = "Data Source=86BC14A814F7477;Initial Catalog=NWMS;User ID=sa;Password=123"

        Dim objAdapter As New SqlDataAdapter(Sql, cnSqlServer)

        objAdapter.Fill(ds, "UserFiles")

        DataGrid.DataSource = ds

        DataGrid.DataBind()

(2) 取消Button触发事件主要代码:

            Dim cmd As New SqlCommand(Sql, conn)

            cmd.Parameters.Add(New SqlParameter("@vWay", SqlDbType.VarChar, 50))

            cmd.Parameters("@vWay").Value = e.Item.Cells(0).Text

5.7 公共共享查询模块

在主界面左边的链接中点击“公共共享”就链接到公共共享查询页面(Publicshar.aspx),该页面也采用DateGrid控件显示所有人共享的文件的信息,用户可以从表中看到文件名、提供用户、文件大小、更新时间、下载统计,默认是按下载统计次数排列。用户可以点击文件名下载共享文件,如发现共享文件内容属于违法、黄色、反动等不合适信息时可以点击举报举报该文件,以便管理员好根据举报来查看、锁定不合理文件。当用户下载了共享区域的文件后,那么该文件的下载统计次数和提供该文件的用户的积分将自动加1。主要代码如下:

(1) 下载事件的主要代码:

            Response.Clear()

            Response.ContentType = "application/octet-stream"

            Response.AppendHeader("Content-Disposition", "attachment;filename=" + filename)

            Response.Flush()

            Response.WriteFile(filepath)

(2) 点击文件下载后,文件下载统计和用户积分自动加1,主要代码:

            cmd.CommandText = "Select vDownCount,UserId From UserFiles where vWay='" & fileW & "'"

            objReader = cmd.ExecuteReader()

            objReader.Read()

            Dim downcount As Integer = objReader.Item(0)

            Dim id As String = objReader.Item(1)

            objReader.Close()

            cmd.CommandText = "Select vUserSore From Users where UserId='" & id & "'"

            objReader = cmd.ExecuteReader

            objReader.Read()

            Dim usersore As Integer = objReader.Item(0)

            objReader.Close()

            downcount += 1

            usersore += 1

            cmd.CommandText = "Update Users set vUserSore='" & usersore & "' where UserId='" & id & "'"

            cmd.ExecuteNonQuery()

            cmd.CommandText = "Update UserFiles set vDownCount='" & downcount & "' where vWay='" & fileW & "'"

            cmd.ExecuteNonQuery()

(3) 点击“举报”触发事件主要代码:

            Dim Sql As String = "UPDATE UserFiles SET vFileUp=vFileUp+1   WHERE vWay=@vWay"

            Dim cmd As New SqlCommand(Sql, conn)

            cmd.Parameters.Add(New SqlParameter("@vWay", SqlDbType.VarChar, 50))

            cmd.Parameters("@vWay").Value = e.Item.Cells(0).Text

5.8 用户资料修改模块

在主界面左边的链接中点击“个人资料“就连接到用户资料修改页面(MayRegedit.aspx),该页面主要是用户进行自己除用户名和性别以外的其他信息的修改,包括密码和密码保护材料的修改。在修改密码和密码保护材料时需要旧密码和保护材料,不过就密码和保护资料不符合,那么将不能进行修改。初始化页的主要代码如下:

            cmd.CommandText = "Select * From Users where UserId='" & userid & "'"

            objReader = cmd.ExecuteReader

            objReader.Read()

            email.Value = objReader.Item(4)

            Label3.Text = objReader.Item(5)

            qq.Value = objReader.Item(6)

            realname.Value = objReader.Item(7)

            phone.Value = objReader.Item(8)

            recommend.Value = objReader.Item(9)

5.9 空间升级查询模块

空间升级查询模块Upgrade.aspx,运用两个Datagrid控件将现有用户空间等级和积分等级的相关信息展示给用户,如用户等级划分,相应空间大小、费用,相应积分等级条件、优惠打折。选择想申请用户空间等级,还会查询到实际应该支付费用。其中还用到了DropDownList控件,用于用户现在用户等级。另外在此模块中用到Datagrid控件要注意的是数据绑定的时候注意定义2个不同的DataSet,主要代码如下:

        Dim objAdapter As New SqlDataAdapter(Sql, cnSqlServer)

        objAdapter.Fill(ds, "IntegralRank")

        DataGrid.DataSource = ds

        DataGrid.DataBind()

        Dim objAdapter1 As New SqlDataAdapter(Sql, cnSqlServer)

        objAdapter1.Fill(ds1, "UsersRank")

        Datagrid1.DataSource = ds1

        Datagrid1.DataBind()

具体页面显示如图3。

 

图3 空间升级信息查询页面

5.10 后台管理登录模块

由于该系统采用用户和管理员分开登录,管理员所有操作界面模块全包含在系统目录的Admin文件夹下。管理员要进行后台管理必须通过此模块(Admin/Default.aspx)登录到后台管理主界面,在管理员输入ID和密码后,和普通用户登录模块一样查询数据库表Admin表,验证是否存在与之相匹配的ID和密码数组,如果存在则登录成功,将管理员ID值赋给Session,页面跳转到后台管理主界面。

5.11 后台管理主界面模块

通过后台管理登录模块登录到后台管理主界面(Admin/Admin0.aspx),该界面同用户主界面模块类似,作为后台管理的枢纽,也是通过分页技术显示,通过左边的一系列超链接按钮来链接到各个管理界面,在右边分页中显示出来。具体页面如图4。

主界面图

5.12 用户管理模块

管理员通过管理员登录验证后登录到后台管理主界面模块,通过左边的链接在右边分页中显示出来,管理员通过“添加用户”可以对用户进行添加,代码实现类似用户注册模块,只不过没那么详细,在这里只添加了用户信息的用户名、密码、用户等级、锁定状态,其他详细信息需要登录该用户后在个人资料里边完善;通过“管理用户”可以查看所有用户,在通过相应行“编辑”超链接连接到各个用户编辑页面(Admin/Admin_user_edit?username={0}),在此页面管理员可以对用户进行密码、用户等级、锁定状态的修改,可以删除用户,删除用户时候还要用rmdir()删除用户空间文件夹,主要代码如下:

        Dim user As String = Request.QueryString("username") '接收传值

        cmd.CommandText = "Delete Users WHERE UserId='" & Label1.Text & "'

通过“添加等级”添加用户等级,通过“管理等级”查询所有用户等级,可点击删除删除相应用户等级,还可以通过修改超链接进入等级修改页面(Admin/admin_rank_edit?id={0}),用户等级设定里边包含了相应用户等级空间大小。其中删除代码类似于文件删除代码,修改代码类型于文件编辑代码。

5.13 管理员管理模块

管理员可以通过该模块的“添加管理员”功能添加新的管理员,权限都相同,添加内容有:管理员帐号、密码、信息联系方式,实现代码类似于用户注册。管理管理员,可以查看所有管理员,可以修改管理员密码、信息联系方式和删除管理员。主要代码如下:

        Dim user As String = Request.QueryString("username")

        Label1.Text = user

            cmd.CommandText = "Select vAdminConn From admin where vAdminId='" & user & "'"

            objReader = cmd.ExecuteReader

            objReader.Read()

            adminconn.Text = objReader.Item(0) '根据传值查询显示相应信息

5.14 共享管理模块

(1) 共享文件页面(Admin/Admin_share_file.aspx)通过DataGrid控件显示出所有的所用户共享的非锁定文件,类似于用户公共共享页面(Publicshar.aspx),包括文件名、大小、提供用户、更新时间、下载统计,管理员可以查看、下载任何共享文件;还可以对共享文件进行锁定,被锁定后的文件将不会在共享区域显示出来,主要代码如下:

            Dim Sql As String = "UPDATE UserFiles SET vFileLock='√'  WHERE vWay=@vWay"

            Dim cmd As New SqlCommand(Sql, conn)

            cmd.Parameters.Add(New SqlParameter("@vWay", SqlDbType.VarChar, 50))

            cmd.Parameters("@vWay").Value = e.Item.Cells(0).Text

(2) 管理员从“举报查看”中查看被用户举报的文件,从中可以看到文件被举报次数统计,并按被举报次数排列,通过查看文件验证共享文件是否不合适,对不合适文件进行锁定。主要代码如下:

        Sql = "Select * From UserFiles WHERE vSharType='共享' AND vFileLock='' AND vFileUp>'0' ORDER BY vFileUp DESC"

        Dim objAdapter As New SqlDataAdapter(Sql, cnSqlServer)

        objAdapter.Fill(ds, "UserFiles")

        DataGrid.DataSource = ds

        DataGrid.DataBind()

(3) 管理员还可以从“被锁定文件”链接到被锁定文件查看页面,对错判而锁定的文件进行解锁。主要代码如下:

            Dim Sql As String = "UPDATE UserFiles SET vFileLock=''  WHERE vWay=@vWay"

            Dim cmd As New SqlCommand(Sql, conn)

            cmd.Parameters.Add(New SqlParameter("@vWay", SqlDbType.VarChar, 50))

            cmd.Parameters("@vWay").Value = e.Item.Cells(0).Text

5.15 收费管理模块

管理员可以添加、删除、修改用户积分等级,按照空间大小收费、根据用户的积分级别实施优惠收费。当某用户申请升级时候,可以查询该用户的积分、积分等级,以及升级到相应等级经过优惠折算后应支付的实际费用。

(1) 添加积分等级SQL语句如下:

                cmd.CommandText = "INSERT INTO IntegralRank(vIntegralRank,vUserSoreU,vUserSoreD,vContrbRed) VALUES('" & Textbox1.Text & "','" & Textbox2.Text & "','" & Textbox3.Text & "','" & Textbox4.Text & "')"

(2) 查看积分等级页面(Admin/Admin_sore.aspx)用DataGrid显示,主要代码如下:

        Sql = "Select * From IntegralRank  ORDER BY vIntegralRank"

        Dim objAdapter As New SqlDataAdapter(Sql, cnSqlServer)

        objAdapter.Fill(ds, "IntegralRank")

        DataGrid.DataSource = ds

        DataGrid.DataBind()

(3) 通过查看积分等级页面DataGrid显示中各行的修改超链接链接到积分等级修改页面(Admin/Admin_sore_edit.aspx),此页面主要代码如下:

Dim id As String = Request.QueryString("id") '获得传值

         cmd.CommandText = "Select * From IntegralRank where vIntegralRank='" & id & "'"

            objReader = cmd.ExecuteReader

            objReader.Read()

            Textbox1.Text = objReader.Item(1)

            Textbox2.Text = objReader.Item(2)

            Textbox3.Text = objReader.Item(3) '初始化页面

(4) 收费查询页面(Admin/Admin_money.aspx),实现查询某特定用户升级到特定用户等级所需要的实际费用,还显示出了该用户的积分、优惠打折,查询Button触发的主要代码如下:

        Dim userrank As Integer = DropDownList1.SelectedValue.Trim()

            '查询该用户积分

            cmd.CommandText = "Select vUserSore From Users where UserId='" & Textbox1.Text & "'"

            objReader = cmd.ExecuteReader

            objReader.Read()

            Label1.Text = objReader.Item("vUserSore")

            objReader.Close()

            '根据积分查询出该用户所处积分等级的优惠打折

            cmd.CommandText = "Select * From IntegralRank "

            objReader = cmd.ExecuteReader

            Do While objReader.Read()

                If Label1.Text > objReader.Item("vUserSoreU") And Label1.Text < objReader.Item("vUserSoreD") Then

                    contrbred = objReader.Item("vContrbRed")

                    Label2.Text = objReader.Item("vContrbRed")

                    i = 1

                    Exit Do

                End If

            Loop

            '查询想要获得用户等级的原价

            cmd.CommandText = "Select vCharge From UsersRank where vUserRank='" & userrank & "'"

            objReader = cmd.ExecuteReader

            objReader.Read()

            Dim charger As String = objReader.Item(0)

            objReader.Close()

            Label3.Text = charger

            Label4.Text = charger * contrbred / 10 '计算出需要升级所支付的实际费用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/586822.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据库(MySQL)—— DQL语句(基本查询和条件查询)

数据库&#xff08;MySQL&#xff09;—— DQL语句&#xff08;基本查询和条件查询&#xff09; 什么是DQL语句基本查询查询多个字段字段设置别名去除重复记录 条件查询语法条件 我们今天进入MySQL的DQL语句的学习&#xff1a; 什么是DQL语句 MySQL中的DQL&#xff08;Data Q…

【ARM 裸机】NXP 官方 SDK 使用

在前几节中&#xff0c;学习了如何编写汇编的 led 驱动、C 语言的 led 驱动、模仿 STM32 进行开发&#xff0c;我们都是自己写外设寄存器的结构体&#xff0c;外设非常的多&#xff0c;写起来费时费力&#xff0c;NXP 针对 I.MX6ULL 编写了一个 SDK 包&#xff0c;这个 SDK 包就…

python的输入输出(爽文,备忘,查询,友好)

Python中的输入输出主要涉及到输入函数和输出函数。 输出函数&#xff1a;print() print() 函数用于将信息输出到屏幕上。它可以输出字符串、变量的值&#xff0c;以及其他各种数据类型。 name "Alice" age 30 print("姓名:", name, "年龄:&quo…

OpenCV如何实现背投(58)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV直方图比较(57) 下一篇&#xff1a;OpenCV如何模板匹配(59) 目标 在本教程中&#xff0c;您将学习&#xff1a; 什么是背投以及它为什么有用如何使用 OpenCV 函数 cv::calcBackP…

轻松下载小程序短剧视频,你不可错过的神器!

探索小程序的精彩短剧&#xff0c;一款神器让您的收藏变得触手可及。轻松下载&#xff0c;无损享受&#xff0c;每个精彩瞬间&#xff0c;都不让你错过。让这款下载神器成为你掌中的宝藏&#xff0c;开启随时随地的精彩观影体验。 这个神器就是下载高手 下载小程序视频的工具…

GoLang Gin实际使用

所有代码同步到Admin/gitDemo - Gitee.comhttps://gitee.com/mec-deployment-team_0/git-demo/tree/dev/ 1.创建Gin框架 一般设计一个常规的web项目&#xff0c;都需要以下几个模块 runApp 主函数&#xff0c;运行整个项目routes 路由控制&#xff0c;管理跳转以及路由分组co…

CTF-Show nodejs

web334 下载附件&#xff0c;有两个文件 在Character.toUpperCase()函数中&#xff0c;字符ı会转变为I&#xff0c;字符ſ会变为S。 在Character.toLowerCase()函数中&#xff0c;字符İ会转变为i&#xff0c;字符K会转变为k。 所以用ctfſhow 123456登录就可以出flag了 w…

力扣刷题第一天:消失的数字

大家好啊&#xff0c;从今天开始将会和大家一起刷题&#xff0c;从今天开始小生也会开辟新的专栏。&#x1f61c;&#x1f61c;&#x1f61c; 目录 第一部分&#xff1a;题目描述 第二部分&#xff1a;题目分析 第三部分&#xff1a;解决方法 3.1 思路一&#xff1a;先排序…

LeetCode1005:K次取反后最大化的数组和

题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。 以这种方式修改数组后&#xff0c;返回数组 可能的最大和 。 解题思想 第…

AC自动机

AC自动机 AC自动机有一个很出色的功能&#xff1a;实现多模式匹配。 多模式匹配&#xff1a;模式串有多个&#xff0c;主串只有一个&#xff0c;要进行多次模式串匹配。如果用KMP就要一个一个模式串进行匹配&#xff0c;效率低。AC自动机就可以做到&#xff0c;只要经过一些预…

深度学习中权重初始化的重要性

深度学习模型中的权重初始化经常被人忽略&#xff0c;而事实上这是非常重要的一个步骤&#xff0c;模型的初始化权重的好坏关系到模型的训练成功与否&#xff0c;以及训练速度是否快速&#xff0c;效果是否更好等等&#xff0c;这次我们专门来看看深度学习中的权重初始化问题。…

RuoYi-Vue-Plus (SPEL 表达式)

RuoYi-Vue-Plus 中SPEL使用 DataScopeType 枚举类中&#xff1a; /*** 部门数据权限*/DEPT("3", " #{#deptName} #{#user.deptId} ", " 1 0 "), PlusDataPermissionHandler 拦截器中定义了解析器&#xff1a; buildDataFilter 方法中根据注解的…

基于电磁激励原理利用视触觉传感器估计抓取力矩的方法

由于触觉感知能使机器人通过其触觉传递获取丰富的接触信息&#xff0c;触觉感知已经成为机器人机械臂的一种流行的感知方式。而在触觉传感器可获取的各种信息中&#xff0c;通过外界接触从抓取物体传递到机器人手指的力矩等信息&#xff0c;在完成各种指令的实现尤为重要。如图…

数据结构––队列

1.队列的定义 2.队列的分类 2.1循环队 2.2链式队 3.队列的实现 3.1循环队 3.1.1声明 typedef int QDataType; #define MAXSIZE 50 //定义元素的最大个数 /*循环队列的顺序存储结构*/ typedef struct {QDataType *data;int front; //头指针int rear; //尾指针 }Queue;…

【最大公约数 排序】2344. 使数组可以被整除的最少删除次数

本文涉及知识点 最大公约数 排序 LeetCode2344. 使数组可以被整除的最少删除次数 给你两个正整数数组 nums 和 numsDivide 。你可以从 nums 中删除任意数目的元素。 请你返回使 nums 中 最小 元素可以整除 numsDivide 中所有元素的 最少 删除次数。如果无法得到这样的元素&a…

Apache中如何配置 ws 接口

Apache中如何配置 wss 接口 在Apache中配置WebSockets的支持&#xff0c;你需要使用mod_proxy_wstunnel模块&#xff0c;该模块是Apache的一个代理模块&#xff0c;它允许你代理WebSocket请求。 以下是配置步骤的简要说明和示例&#xff1a; 确保你的Apache服务器安装了mod_…

【Python小练】求斐波那契数列第n个数

题目 输出斐波那契数列第n个数。 分析 首先我们要知道&#xff0c;斐波那契数列&#xff0c;这个数列从第三位开始等于前两个数的和&#xff0c;要知道数列第n个数&#xff08;n>2&#xff09;&#xff0c;就要知道其前两相的值&#xff0c;着就需要用到递归了。来看一下吧…

【Java EE】多线程(二)Thread 类与常用方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 |《Web世界探险家》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更…

【C++】:日期类的实现 -- 日期计算器

前言 1.日期类是一种十分经典的类型。对于C的初学者&#xff0c;它能够帮助我们融会贯通许多C的基础知识&#xff0c;它涉及许多的基础语法&#xff0c;比如引用&#xff0c;函数重载&#xff0c;传值/传参返回&#xff0c;构造函数&#xff0c;运算符重载&#xff0c;const成…

【Linux】详解core dump文件的作用以及用法ubuntu20.04下无法形成core dump文件的解决办法

说明 从第三大点开始讲解ubuntu20.04下无法形成core dump文件的解决办法。 一、core与term的区别 在之前讲过的信号中&#xff0c;终止进程的信号的动作分为两种&#xff0c;一种是core&#xff0c;一种是term。term&#xff08;全称termination&#xff09;是直接终止进程&am…