首页 > 解决方案 > 在页面加载 vb.net 上创建的重复记录

问题描述

我试图弄清楚为什么我的代码在执行时将两条记录插入数据库?Sub执行CreateEnrollment良好,但结果插入 2 有时 3 条记录,间隔 1-10 秒,具体取决于远程服务器负载。我首先认为这可能是IsPostBack问题,但添加If Not Page.IsPostBack Then并没有解决。

Dim FailedMessage As String = "This COPDI (On-Line) user failed: "
Dim PassedMessage As String = "This COPDI (On-Line) user passes: "
Dim ClassName As String = "COPDI (FAILED)"
Dim SendMailAddress As String = "myEmailAddress.com"
Dim SubsiteConnString As String = "Subsite_appSettings"
Dim MainsiteConnString As String = "SubsiteConn"
Dim RecordsReturned As Integer = 0

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim UserName As String = User.Identity.Name()
    Dim userID As Integer = GetUID(UserName)
    Dim ClassDate As Date = DateTime.Now.AddHours(3).ToShortDateString
    Dim ClassTime As String = DateTime.Now.AddHours(3). ToShortTimeString 
    
    If Not Page.IsPostBack Then
    
        If Request.QueryString("code") = 1111 Then
            RecordsReturned = RecordExist(UserName)
            CreateEnrollment(UserName, ClassDate, ClassTime, ClassName, userID)
            UpdateLastActivityDate(UserName)
        
            If RecordsReturned < 3 Then
                Response.Redirect("~/transcript.aspx" & "?code=" & RecordsReturned)
            Else  
                Response.Redirect("~/transcript.aspx" & "?code=" & "more_than_three")
            End If
        End If
    End If
End Sub


Public Sub CreateEnrollment(ByVal UserName As String, ByVal ClassDate As Date, ByVal ClassTime As String, ByVal ClassName As String, ByVal UID As Integer)
    Dim connStr As String = ConfigurationManager.AppSettings.Get(SubsiteConnString)
    Dim conn As New Data.OleDb.OleDbConnection(connStr)
Try
    conn.Open()
    Dim sql As String = "INSERT INTO EnrollmentsTbl (" & _
    "[UserName],[SubmitTime],[ClassTime],[ClassDate],[Enrolled],[ClassName],[Instructor],[DateCompleted],[Completed],[WaitListed],[UID]) " & _
    "VALUES (@UserName, @SubmitTime, @ClassTime, @ClassDate, @Enrolled, @ClassName, @Instructor, @DateCompleted, @Completed, @WaitListed, @UID) "

    Dim comm As New Data.OleDb.OleDbCommand(sql, conn)

    comm.Parameters.AddWithValue("@UserName", UserName)
    comm.Parameters.AddWithValue("@SubmitTime", DateTime.Now.AddHours(3).ToString())
    comm.Parameters.AddWithValue("@ClassTime", ClassTime)
    comm.Parameters.AddWithValue("@ClassDate", ClassDate)
    comm.Parameters.AddWithValue("@Enrolled", True)
    comm.Parameters.AddWithValue("@ClassName", ClassName)
    comm.Parameters.AddWithValue("@Instructor", "On-line")
    comm.Parameters.AddWithValue("@DateCompleted", DateTime.Now.AddHours(3).ToString)
    comm.Parameters.AddWithValue("@Completed", False)
    comm.Parameters.AddWithValue("@WaitListed", False)
    comm.Parameters.AddWithValue("@UID", UID)
    Dim result As Integer = comm.ExecuteNonQuery()
    
Catch ex As Exception
        Response.Write(ex)
Finally
        conn.Close()
End Try  
End Sub


Public Function RecordExist(ByVal username As String) As Integer
    Dim connStr As String = ConfigurationManager.AppSettings.Get(SubsiteConnString)
    Dim conn As New Data.OleDb.OleDbConnection(connStr)
    Dim sql As String = "SELECT COUNT(*) FROM EnrollmentsTbl " & _
        "WHERE [UserName] = """ & username & """ AND ClassName LIKE """ & ClassName & """ AND [Completed] = 0 AND [Enrolled] = -1"
    Dim DBCommand As New Data.OleDb.OleDbCommand(sql, conn)
   Try
        conn.Open()
        Dim RecordCount As Integer = CInt(DBCommand.ExecuteScalar())
        conn.Close()
        Return RecordCount
    Catch ex As Exception
        Response.Write(ex)
    Finally
        conn.Close()
    End Try
End Function


Public Function GetUID(ByVal username As String) As Integer
    Dim xUserName As String = User.Identity.Name()

    If (Not xUserName="") Then
 
    Dim objConn As Data.OleDb.OleDbConnection
    Dim objCmd As Data.OleDb.OleDbCommand
    Dim objRdr As Data.OleDb.OleDbDataReader
    Dim userAN As String
    Dim strConnection As String = ConfigurationManager.ConnectionStrings("TechTrainingConn").ToString
    objConn = New Data.OleDb.OleDbConnection(strConnection)
    objCmd = New Data.OleDb.OleDbCommand("SELECT * FROM UsersDataTbl WHERE [UserName] = """ & xUserName & """", objConn)
        Try
            objConn.Open()
            objRdr = objCmd.ExecuteReader()

            While objRdr.Read()
                userAN = objRdr.Item("UID")
            End While
            objRdr.Close()
            objConn.Close()

            Session("userID") = userAN
            Return userAN
                'Response.Write(Session("userAN") & " - " & xUserName)
        Catch ex As Exception
            Response.Write(ex)
        Finally
            objConn.Close()
        End Try
    End If
End Function

标签: asp.netvb.netms-access-2010

解决方案


What aspx page is this supporting? I noticed you have a redirect to transcript.aspx, is this code for that page? If so that would explain the multiple page loads. Response.Redirect is not a postback so it's going to fall into recordReturned and CreateEnrollment methods again, especially if you are passing the &code=1111 in the URL querystring


推荐阅读