【问题标题】:Record inserts into wrong table. Any ideas why and how to fix it?记录插入错误的表。任何想法为什么以及如何解决它?
【发布时间】:2013-06-19 23:49:54
【问题描述】:

这对我来说很奇怪。

我尝试获取此代码的存储过程版本,但没有成功。

这是一款培训应用。用户必须先注册才能创建帐户。

然后他们使用自己的帐户注册课程。

首先,代码会检查该用户是否已经注册了特定课程。

如果没有,则注册用户。如果是,请通知该用户他/她已经注册。

这个位有效。

如果用户尚未注册并正在尝试注册,请检查是否仍有可用席位。如果是,请注册用户。如果没有更多座位可用,则通过将用户插入一个名为 tblWaitinglist 的表中,将用户列入等候名单。

到目前为止,每次我尝试插入新记录时,它都会说,班级已满,用户正在等待列表中。

这不是真的。类完全是空的。

共有 45 个座位​​。

到目前为止,所有座位都已空位。

我到底做错了什么?

它甚至没有插入等候名单。它只是给出了它所做的信息。

请在下面查看我的代码,并提前非常感谢。

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim username = Session("Username")
    Dim connStr As String = ConfigurationManager.ConnectionStrings("DBConnectionString").ConnectionString
    Dim conn As New SqlConnection(connStr)
    conn.Open()
    Try

        Dim s As String
        Dim counter As Integer

        'If user already registered for a class, alert user
        s = "SELECT Count(*) FROM tblTrainings WHERE Username = '" & username & "' AND CourseID = " & Request.QueryString("cosId") & "  AND LocationID = " & Request.QueryString("locid") & " AND dateId = " & Request.QueryString("iddate") & ""
        'Response.Write(s)
        'Response.End()
        Dim connSt As String = ConfigurationManager.ConnectionStrings("DBConnectionString").ConnectionString
        Dim connc As New SqlConnection(connSt)
        Dim cmdc As New SqlCommand(s, connc)
        connc.Open()
        cmdc.ExecuteNonQuery()
        counter = cmdc.ExecuteScalar()


        '   Now let's see if we found existing record of registration
        If counter = 0 Then 'User has not registered for this training. In that case, check to see there are still seats available.
            Dim SeatsAvailable As Integer
            SeatsAvailable = 0

            s = " SELECT SeatsAvailable = (Select Seating_Capacity  - (Select count(*) from tblTrainings where courseId = @cosId) from tblLocations WHERE LocationId = @Locid)"
            'Response.Write(s)
            'Response.End()
            Dim cmdB As New SqlCommand(s, conn)
            cmdB.Parameters.AddWithValue("@cosID", Request.QueryString("cosId"))
            cmdB.Parameters.AddWithValue("@locID", Request.QueryString("locid"))
            cmdB.ExecuteNonQuery()


            If SeatsAvailable > 0 Then 'Ok there are still seats available. Sign this user up.
                s = "INSERT INTO tblTrainings (CourseId, LocationId, dateId,username) VALUES (@CosID, @LocID, @dat, @Username)"
                Dim cmd = New SqlCommand(s, conn)
                cmd.Parameters.AddWithValue("@cosID", Request.QueryString("cosId"))
                cmd.Parameters.AddWithValue("@locID", Request.QueryString("locid"))
                cmd.Parameters.AddWithValue("@dat", Request.QueryString("iddate"))
                cmd.Parameters.AddWithValue("@UserName", username)
                'Response.Write(s)
                'Response.End()
                cmd.ExecuteNonQuery()
                Dim cmdGetKey As New SqlCommand("SELECT @@IDENTITY", conn)
                Dim skey As Integer = cmdGetKey.ExecuteScalar()
                Session("TrainingId") = skey
                conn.Close()
                confirmRegistraction()
                Label1.ForeColor = System.Drawing.Color.Red
                Label1.Text = "Congratulations! You have been registered for this class. Please check your email inbox for details"
            Else 'No seats remain. So, put user on waiting list
                s += "INSERT INTO tblWaitingList (CourseId, LocationId, dateId,username) VALUES (@CosID, @LocID, @dat, @Username)"
                Dim cmd = New SqlCommand(s, conn)
                cmd.Parameters.AddWithValue("@cosID", Request.QueryString("cosId"))
                cmd.Parameters.AddWithValue("@locID", Request.QueryString("locid"))
                cmd.Parameters.AddWithValue("@dat", Request.QueryString("iddate"))
                cmd.Parameters.AddWithValue("@UserName", username)
                'Response.Write(s)
                'Response.End()
                cmd.ExecuteNonQuery()
                Dim cmdGetKey As New SqlCommand("SELECT @@IDENTITY", conn)
                Dim skey As Integer = cmdGetKey.ExecuteScalar()
                Session("TrainingId") = skey
                conn.Close()
                onWaitingList()
                'Display some feedback to the user to let them know it was processed
                Label1.ForeColor = System.Drawing.Color.Red
                Label1.Text = "Sorry, but this class is full. However, you have been placed on waiting list."
            End If

        Else
            'Alert user that s/he has already registered for this class
            Label1.ForeColor = System.Drawing.Color.Red
            Label1.Text = "You have already signed up for this training."
        End If

    Catch

        'If the message failed at some point, let the user know
        Label1.ForeColor = System.Drawing.Color.Red
        Label1.Text = "Your record failed to save, please try again."

    End Try
End Sub

【问题讨论】:

  • 您应该查看usingtry/catch/finally 以清理代码中的资源。
  • 问题似乎是SeatsAvailable总是0。你试过调试吗?也许是因为你从来没有给它分配过 0 以外的任何东西? s = " SELECT SeatsAvailable [...]" 不会神奇地将查询的输出写入名为 SeatsAvailable 的变量中,您必须从查询结果中分配它。不幸的是,您致电 ExecuteNonQuery() 不允许您这样做。
  • 第一个@CodeCaster,对不起代码和文字的墙。有时,很难判断什么时候足够了,因为总是出现说“没有足够的信息或代码”来回答你的问题,SeatsAvailable 并不总是 0。如果我在 SSMS 上运行该查询,它会输出正确的值,在本例为 45。此外,如前所述,即使它说您已被列入候补名单,也应该将一条记录插入到候补名单表中。没有任何东西被插入到表中。
  • 您的程序未在 SSMS 中运行查询。它也不会将查询结果分配给任何东西。放一个断点。检查SeatsAvailable 变量。看到它总是0。看看ExecuteScalar()方法。
  • 仅供参考,这并不是真正使用存储过程,因为您仍在使用内联 SQL。

标签: asp.net vb.net


【解决方案1】:

看起来您从未将 SeatsAvailable 设置为零以外的任何值。您的 s 变量可能就是您想要查看的内容。

INSERT 失败完全是另一个问题。

【讨论】:

  • @Dourglas 和 CodeCaster,实际上我错了一件事。记录被插入到 WaitingList 表中,是的,消息是正确的。但问题是它应该在 SeatsAvailable 大于 0 时插入到 Training 表中。我的逻辑错了吗?
  • 我现在开始工作了。我删除了 SeatsAvailable=0 并改用它: SeatsAvailable = cmdB.ExecuteScalar() 并且它有效。你们是最伟大的。谢谢
猜你喜欢
  • 1970-01-01
  • 2012-05-20
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多