我的代码产生了错误的结果。谁能告诉我我做错了什么?

时间:2013-06-21 14:23:14

标签: asp.net sql vb.net

我为这条长篇帖子道歉。

我对这段代码无效的原因感到非常惊讶。

请看一下。

关于标记,

<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的函数,其代码如下:

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日的第一个培训日期还剩8天之前还剩一天   在2013年6月29日第二次培训之前。

这意味着在我的应用上(请参见截图),我希望看到一个按钮被禁用而另一个按钮被启用。   ![在此处输入图像说明] [1]   从截图中可以看出,这种情况并没有发生。无论培训日期是什么,两者都要启用或禁用。

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

不确定这是怎么回事。自从我为此奋斗至少已经过去了3天。

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

提前感谢您的协助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

Response.Write(DaysCount)没有产生11,而是产生1和1,这是6/22/2013和6/21/2013之间的差异。你有两行,所以每个数字必须是一个不同的行,两行似乎都有相同的日期差异。

您可能需要声明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使用的方法。但话说回来,他的方法完全避免了这个问题。