开发实践教程1:试卷生成系统6.12 试卷管理(FormTestPaperManager)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

当试卷生成后在“试卷生成”界面调整试卷信息比较复杂,因此单独设置“试卷管理”,允许用户更新自己创建的试卷的信息(仅试卷名称和试卷说明),还提供“删除”试卷功能,执行删除时除了删除《用户试卷表》内的数据外,还将删除《用户试卷详表》内相关的数据。

窗体设计如下:

图1-22

在删除试卷时,使用了SqlTransaction类,通过此类可以在MS Sql数据库中生成的Transact-SQL 事务,可以执行一连串的sql操作,如果其中一个操作失败,那么可以将所有操作回滚,复原数据。SqlTransaction类的简单用法如下:

建立事务类:

        Dim st As SqlTransaction

获得事务对象:

        st = connection.BeginTransaction

设置SqlCommand的事务为刚定义的事务:

        command.Transaction = st

        Try

从 用户试卷表 中删除试卷信息:

            command.CommandText = "delete from 用户试卷表 where 编号=" & dgv.SelectedRows(0).Cells(0).Value

            command.ExecuteNonQuery()

从 用户试卷详表 中删除试卷对应的所有考题信息:

            command.CommandText = "delete from 用户试卷详表 where 试卷编号=" & dgv.SelectedRows(0).Cells(0).Value

            command.ExecuteNonQuery()

提交事务:

            st.Commit()

        Catch ex As Exception

如果发生错误,则还原事务:

            st.Rollback()

        End Try

具体代码如下:

Imports System.Data.SqlClient

Public Class FormTestPaperManager

    Dim connection As SqlConnection
    Dim ds As DataSet
    Dim adapter As SqlDataAdapter
    Dim dt As DataTable

    Const pagesize As Integer = 50
    Dim maxPage As Integer
    Dim currentPage As Integer

    Dim F_Main As FormMain

    Dim sqlMySelect As String
    Dim sqlMyFrom As String
    Dim sqlMyOrder As String
    Dim sqlMyWhere As String

    Dim sqlQuerySelect As String
    Dim sqlQueryFrom As String
    Dim sqlQueryOrder As String
    Dim sqlQueryWhere As String

    Dim sqlFlag As String

    Public customWhere As String

    Dim dgvCanResize As Boolean = False

    Private Sub FormTestPaperManager_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.WindowState = FormWindowState.Maximized
        connection = New SqlConnection(databaseConnString)
        connection.Open()

        F_Main = CType(Me.MdiParent, FormMain)

        sqlMySelect = "SELECT 用户试卷表.编号 as 编号, 用户试卷表.试卷名称 as 试卷名称, 用户试卷表.试卷说明 as 试卷说明, 考试类型表一级.类型名称 as 一级考试类型, 
                        考试类型表二级.类型名称 as 二级考试类型, 考试类型表三级.类型名称 as 三级考试类型, 用户试卷表.总分值 as 总分值, 
                        用户试卷表.考试时长 as 考试时长, 用户表.真实姓名 as 创建人, 用户试卷表.录入时间 as 创建时间,用户试卷表.是否有效 as 是否有效 "
        sqlMyFrom = "FROM (((用户试卷表 INNER JOIN 考试类型表三级 ON 用户试卷表.试卷类型 = 考试类型表三级.编号) INNER JOIN 
                    考试类型表二级 ON 考试类型表三级.二级类型 = 考试类型表二级.编号) 
                    INNER JOIN 考试类型表一级 ON 考试类型表二级.一级类型 = 考试类型表一级.编号) 
                    INNER JOIN 用户表 ON 用户试卷表.录入人ID = 用户表.编号 "
        If permissions = 0 Then
            sqlQueryWhere = ""
        Else
            sqlMyWhere = "where 用户试卷表.录入人ID=" & loginId
        End If
        sqlMyOrder = "order by 用户试卷表.录入时间 desc"


        sqlQuerySelect = "SELECT 用户试卷表.编号 as 编号, 用户试卷表.试卷名称 as 试卷名称, 用户试卷表.试卷说明 as 试卷说明, 考试类型表一级.类型名称 as 一级考试类型, 
                        考试类型表二级.类型名称 as 二级考试类型, 考试类型表三级.类型名称 as 三级考试类型, 用户试卷表.总分值 as 总分值, 
                        用户试卷表.考试时长 as 考试时长, 用户表.真实姓名 as 创建人, 用户试卷表.录入时间 as 创建时间,用户试卷表.是否有效 as 是否有效 "
        sqlQueryFrom = "FROM (((用户试卷表 INNER JOIN 考试类型表三级 ON 用户试卷表.试卷类型 = 考试类型表三级.编号) INNER JOIN 
                    考试类型表二级 ON 考试类型表三级.二级类型 = 考试类型表二级.编号) 
                    INNER JOIN 考试类型表一级 ON 考试类型表二级.一级类型 = 考试类型表一级.编号) 
                    INNER JOIN 用户表 ON 用户试卷表.录入人ID = 用户表.编号 "
        sqlQueryWhere = ""
        sqlQueryOrder = "order by 用户试卷表.录入时间 desc"

        sqlFlag = "my"
        currentPage = 0

        Call showGrid(sqlFlag)

    End Sub

    Public Sub showGrid(ByVal tableFlag As String)
        ds = New DataSet(tableFlag)
        Dim command As New SqlCommand()

        Dim sqlSelect As String = ""
        Dim sqlFrom As String = ""
        Dim sqlWhere As String = ""
        Dim sqlOrder As String = ""

        Select Case tableFlag
            Case "my"
                sqlSelect = sqlMySelect
                sqlFrom = sqlMyFrom
                sqlWhere = sqlMyWhere
                sqlOrder = sqlMyOrder

            Case "custom"
                sqlSelect = sqlQuerySelect
                sqlFrom = sqlQueryFrom
                sqlWhere = sqlQueryWhere
                sqlOrder = sqlQueryOrder

        End Select
        command.CommandText = "select count(*) " & sqlFrom & sqlWhere
        command.Connection = connection

        Dim count As Integer = command.ExecuteScalar


        F_Main.tsslInfo.Text = "数据总数:" & count & " 条"

        If count < pagesize Then
            tsbFirstPage.Enabled = False
            tsbPrevPage.Enabled = False
            tsbNextPage.Enabled = False
            tsbLastPage.Enabled = False
        Else
            tsbFirstPage.Enabled = True
            tsbPrevPage.Enabled = True
            tsbNextPage.Enabled = True
            tsbLastPage.Enabled = True
        End If

        command.CommandText = sqlSelect &
                        sqlFrom &
                        sqlWhere &
                        sqlOrder

        adapter = New SqlDataAdapter(command)

        maxPage = Math.Ceiling(count / pagesize)

        If currentPage > maxPage Then currentPage = maxPage

        adapter.Fill(ds, currentPage * pagesize, pagesize, tableFlag)
        dgv.DataSource = Nothing
        dgv.DataSource = ds.Tables(tableFlag)
        tslRecord.Text = (currentPage + 1).ToString & "/" & maxPage.ToString

        dgv.Columns(0).Visible = False
        dgv.Columns(2).Visible = False
        dgvCanResize = True

    End Sub

    Private Sub tsbMyPaper_Click(sender As Object, e As EventArgs) Handles tsbMyPaper.Click
        sqlFlag = "my"
        Call showGrid(sqlFlag)

        tsbEdit.Enabled = True
        tsbDelete.Enabled = True
    End Sub


    Private Sub tsbFirstPage_Click(sender As Object, e As EventArgs) Handles tsbFirstPage.Click
        currentPage = 0
        ds.Tables(sqlFlag).Clear()
        adapter.Fill(ds, currentPage * pagesize, pagesize, sqlFlag)
        dgv.DataSource = ds.Tables(sqlFlag)

        tslRecord.Text = (1).ToString & "/" & maxPage.ToString
    End Sub
    Private Sub tsbPrevPage_Click(sender As Object, e As EventArgs) Handles tsbPrevPage.Click
        If currentPage = 0 Then
            MessageBox.Show("已经是第一页了")
            Exit Sub
        End If
        currentPage -= 1
        ds.Tables(sqlFlag).Clear()
        adapter.Fill(ds, currentPage * pagesize, pagesize, sqlFlag)
        dgv.DataSource = ds.Tables(sqlFlag)
        tslRecord.Text = (currentPage + 1).ToString & "/" & maxPage.ToString
    End Sub
    Private Sub tsbNextPage_Click(sender As Object, e As EventArgs) Handles tsbNextPage.Click
        If currentPage = maxPage - 1 Then
            MessageBox.Show("已经是最后一页了")
            Exit Sub
        End If
        currentPage += 1
        ds.Tables(sqlFlag).Clear()
        Dim recordcount As Integer = adapter.Fill(ds, currentPage * pagesize, pagesize, sqlFlag)
        dgv.DataSource = ds.Tables(sqlFlag)
        tslRecord.Text = (currentPage + 1).ToString & "/" & maxPage.ToString
    End Sub
    Private Sub tsbLastPage_Click(sender As Object, e As EventArgs) Handles tsbLastPage.Click
        currentPage = maxPage - 1
        ds.Tables(sqlFlag).Clear()
        adapter.Fill(ds, currentPage * pagesize, pagesize, sqlFlag)
        dgv.DataSource = ds.Tables(sqlFlag)
        tslRecord.Text = (currentPage + 1).ToString & "/" & maxPage.ToString
    End Sub


    Private Sub tsbQuery_Click(sender As Object, e As EventArgs) Handles tsbQuery.Click
        Dim fQuery As New formPaperManagerQuery
        fQuery.ShowDialog(Me)

        If customWhere = "" Then
            Exit Sub
        End If

        sqlQueryWhere = "where " & customWhere

        sqlFlag = "custom"

        Call showGrid(sqlFlag)
    End Sub

    Private Sub tsbEdit_Click(sender As Object, e As EventArgs) Handles tsbEdit.Click
        If dgv.SelectedRows.Count < 1 Then
            MessageBox.Show("你还没有选择需要更新的试卷。", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If
        Dim dgvRowIndex As Integer
        dgvRowIndex = dgv.SelectedRows(0).Index
        Dim id As Integer
        Dim paperName As String
        Dim paperInfo As String

        id = dgv.SelectedRows(0).Cells(0).Value
        paperName = dgv.SelectedRows(0).Cells(1).Value
        paperInfo = dgv.SelectedRows(0).Cells(2).Value

        Dim fPaperInfoUpdate As New FormPaperInfoUpdate(dgvRowIndex, id, paperName, paperInfo)
        fPaperInfoUpdate.ShowDialog(Me)

    End Sub

    Private Sub tsbDelete_Click(sender As Object, e As EventArgs) Handles tsbDelete.Click
        If dgv.SelectedRows.Count < 1 Then
            MessageBox.Show("你还没有选择需要删除的试卷。", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Warning)
            Exit Sub
        End If

        Dim paperIndex As Integer
        paperIndex = dgv.SelectedRows(0).Index

        If MessageBox.Show("你确定要删除试卷 " & dgv.SelectedRows(0).Cells(1).Value & " ?", "提示信息", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) = DialogResult.Cancel Then
            Exit Sub
        End If

        Dim command As New SqlCommand()
        command.Connection = connection

        Dim st As SqlTransaction
        st = connection.BeginTransaction
        command.Transaction = st

        Try
            command.CommandText = "delete from 用户试卷表 where 编号=" & dgv.SelectedRows(0).Cells(0).Value
            command.ExecuteNonQuery()
            command.CommandText = "delete from 用户试卷详表 where 试卷编号=" & dgv.SelectedRows(0).Cells(0).Value
            command.ExecuteNonQuery()
            st.Commit()
            MessageBox.Show("删除试卷成功", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information)

            Call showGrid(sqlFlag)
        Catch ex As Exception
            st.Rollback()
            MessageBox.Show("删除试卷失败。失败原因:" & vbCrLf & ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try


    End Sub

    Private Sub tsbHome_Click(sender As Object, e As EventArgs) Handles tsbHome.Click
        F_Main.tsslInfo.Text = ""
        Me.Close()
    End Sub
End Class

由于.net平台下C#和vb.NET很相似,本文也可以为C#爱好者提供的参考。

学习更多vb.net知识,请参看 vb.net 教程 目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值