1

我为长线道歉。

我很惊讶为什么这段代码不能正常工作。

请看一看。

在标记上,

<asp:TemplateField HeaderText="Action">
     <ItemTemplate>
         <asp:Button ID="cancelBtn" style="width:105px;padding:5px;margin:5px;" runat="server" CommandName="delete"  OnDataBinding="btnDelete_DataBinding" OnClientClick='return confirm("Are you sure you want to delete this entry?");' Text="Cancel Training" />
     </ItemTemplate> 
</asp:TemplateField>

然后我有一个名为getDateDifference()As Boolean 的函数,代码如下:

Private Function getDateDifference() As Boolean
    Dim username = Session("Username")
    Dim myConnectionString As [String] = ConfigurationManager.ConnectionStrings("DBConnectionString").ConnectionString
    Dim myConnection As New SqlConnection(myConnectionString)

    myConnection.Open()

    Dim cmd1 As New SqlCommand("select  DateDiff(dd,GetDate(),d.trainingDates) as DaysCount " & _
                                           "from tblTrainings t Inner Join tblCourses c on t.courseId = c.courseId " & _
                                           "Inner Join tblLocations l on t.locationId = l.LocationId " & _
                                           "Inner Join tblTrainingDates d on t.dateid=d.dateid " & _
                                           "Inner Join tblCourseInstructor ic on c.courseId = ic.CourseId " & _
                                           "Inner Join tblInstructors i on ic.instructorId = i.instructorId " & _
                                           "Inner Join tblLogin lg on t.username = lg.username where lg.username =  @username", myConnection)
    cmd1.Parameters.AddWithValue("@username", username)
    Dim dr1 As SqlDataReader = cmd1.ExecuteReader()
    If dr1.Read() Then
        Dim DaysCount As Integer = dr1("DaysCount")
        Response.Write(DaysCount)
        If DaysCount >= 2 Then
            Return True
        Else
            Return False
        End If

    End If
    Return False
End Function

该函数在下面调用:

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim btn As Button = DirectCast(e.Row.FindControl("cancelBtn"), Button)
        btn.Enabled = Not getDateDifference()
    End If
End Sub

我们要做的就是将培训日期与当前日期进行比较。

如果当前日期在培训日期的 24 小时(或 2 天)内,则已注册课程的用户无法取消该课程。

如果当前日期比培训日期早 2 天,用户可以取消。

为了测试,我在我的帐户上安排了 2 次培训。

一个培训日期是 2013 年 6 月 22 日

另一个培训日期是 2013 年 6 月 29 日。

当我运行上面的查询时,我分别得到 1 天和 8 天。

这是正确的,因为今天的日期是 2013 年 6 月 21 日,即距离第一次培训日期 2013 年 6 月 22 日还有一天,距离第二次培训日期 2013 年 6 月 29 日还有 8 天。

这意味着在我的应用程序(请参阅屏幕截图)上,我希望看到一个按钮被禁用而另一个按钮被启用。![在此处输入图像描述][1] 正如您从屏幕截图中看到的那样,这并没有发生。无论培训日期是什么,两者都处于启用或禁用状态。

当我尝试使用 response.write (DaysCount) 调试 DaysCount 时,它显示11

不知道这是怎么发生的。自从我一直在努力解决这个问题以来,至少已经有 3 天了。

数据库是 sql server 2005。但是生产数据库是 2008。

提前感谢你的帮助。

4

2 回答 2

2

我不确定这里发生了什么,但要尝试调试它,我只会d.trainingDates从您的数据库查询返回而不是执行DateDiff,然后执行此操作来验证它:

If dr1.Read() Then
    Dim trngDate As Date = dr1("trainingDates")
    Response.Write(trngDate.ToString)
    If (trngDate - DateTime.Now).TotalDays >= 2 Then
        Return True
    Else
        Return False
    End If

End If

编辑

但是 - 为什么不只比较 RowDataBound 事件中的日期。

无需执行另一个查询,您要比较的日期在您绑定的行中

像这样(未经测试)的代码:

Protected Sub GridView1_RowDataBound(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If e.Row.RowType = DataControlRowType.DataRow Then
        Dim dateValue As Date = Date.Parse(Convert.ToString(DataBinder.Eval(e.Row.DataItem, "Dates")))
        Dim btn As Button = DirectCast(e.Row.FindControl("cancelBtn"), Button)
        btn.Enabled = (dateValue - DateTime.Now).TotalDays >= 2
    End If
End Sub
于 2013-06-21T14:33:54.633 回答
1

我知道您接受了@Matt Wilko 的回答,但只是为了回答您面临的具体问题:-

问题是您的查询返回tblTraining用户的所有记录。where 子句中没有条件来确定哪条tblTraining记录是当前活动的记录。

Response.Write(DaysCount)没有生产 11,而是生产了 1 和 1,这是 2013 年 6 月 22 日和 2013 年 6 月 21 日之间的差异。您有 2 行,因此每个数字必须用于不同的行,并且两行似乎都获得了相同的日期差异。

您可能需要声明Private Function getDateDifference(courseId as Integer) As Boolean或类似的东西,以便您可以将 传递courseId给函数并在 SQL 语句中使用它来识别您想要的特定培训计划。您的 SQL 语句可能看起来像

Dim cmd1 As New SqlCommand(_
    "select  DateDiff(dd,GetDate(),d.trainingDates) as DaysCount " & _
    "from tblTrainings t Inner Join tblCourses c on t.courseId = c.courseId " & _
    "Inner Join tblLocations l on t.locationId = l.LocationId " & _
    "Inner Join tblTrainingDates d on t.dateid=d.dateid " & _
    "Inner Join tblCourseInstructor ic on c.courseId = ic.CourseId " & _
    "Inner Join tblInstructors i on ic.instructorId = i.instructorId " & _
    "Inner Join tblLogin lg on t.username = lg.username " & _
    "where lg.username =  @username and " & _
    "t.courseId = @courseId", myConnection)
cmd1.Parameters.AddWithValue("@courseId", courseId)

至于你在哪里可以得到你的courseId,你可以使用@Matt Wilko 使用的方法。但话又说回来,他的方法完全可以避免这整个问题。

于 2013-06-21T15:25:57.253 回答