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

私たちがやろうとしているのは、trainingdates を現在の日付と比較することだけです。

現在の日付がトレーニング日から 24 時間 (または 2 日) 以内の場合、既にクラスにサインアップしているユーザーはそのクラスをキャンセルできません。

現在の日付がトレーニング日の 2 日以上前の場合、ユーザーはキャンセルできます。

テストするために、アカウントで 2 つのトレーニングがスケジュールされています。

1 つのトレーニング日は 2013 年 6 月 22 日です。

もう 1 つのトレーニング日は 2013 年 6 月 29 日です。

上記のクエリを実行すると、それぞれ 1 日と 8 日になります。

今日の日付は 2013 年 6 月 21 日であるため、これは正しいです。つまり、2013 年 6 月 22 日の最初のトレーニング日まであと 1 日、2013 年 6 月 29 日の 2 番目のトレーニング日まであと 8 日あります。

これは、私のアプリ (スクリーンショットを参照してください) で、1 つのボタンが無効になり、もう 1 つのボタンが有効になることを期待していることを意味します。![ここに画像の説明を入力][1] スクリーンショットからわかるように、これは起こっていません。トレーニングの日付に関係なく、両方が有効または無効になっています。

response.write (DaysCount) で DaysCount をデバッグしようとすると、11と表示されます。

これがどのように起こっているのかわかりません。これに苦労してから少なくとも3日が経ちました。

DBは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 つの行があったため、各桁は異なる行である必要があり、両方の行が同じ日付の差になっているようです。

関数に を渡し、それを SQL ステートメントで使用して、必要な特定のトレーニング プログラムを識別することができるように、おそらく宣言するPrivate Function getDateDifference(courseId as Integer) As Booleanか、それに類似したものを作成する必要があります。courseIdおそらくあなたの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 に答える