0

特定の日付の Access データベースから VB.NET のデータグリッド ビューにデータを読み込もうとしています。そのために日時ピッカーを使用します。以下のコードは、データの取得に使用しました。しかし、私は検索ボタンを押します。データグリッド ビューには何も表示されません。これがコードです

Private Sub BTNFIND_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNFIND.Click
    ATCEDITGRID.Rows.Clear()
    getConnect()
    'Dim editdate As String
    DTPEDITAT.Value = Format(DTPEDITAT.Value, "dd/MM/yyyy")
    'MessageBox.Show(DTPEDITAT.Value)
    'editdate = DTPEDITAT.Value
    Try
        Conn.Open()
        Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = " & DTPEDITAT.Value & " ORDER BY EMP_NAME ASC"
        Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(strSQL, Conn)
        Dim ds As DataSet = New DataSet
        da.Fill(ds, "ATTENDANCE")
        Dim dt As DataTable = ds.Tables("ATTENDANCE")
        Dim row As DataRow
        Dim atstat As String
        For Each row In dt.Rows
            If row("AT_STATUS") = 1 Then
                atstat = "Present"
            ElseIf row("AT_STATUS") = 0 Then
                atstat = "Absent"
            ElseIf row("AT_STATUS") = 0.5 Then
                atstat = "Halfday"
            Else
                atstat = "Error"
            End If
            'MessageBox.Show(row("EMP_ID"))
            'MessageBox.Show(row("EMP_NAME"))
            'MessageBox.Show(atstat)
            'MessageBox.Show(row("AT_REMARK"))
            Me.ATCEDITGRID.Rows.Add(row("EMP_ID"))
            Me.ATCEDITGRID.Rows.Add(row("EMP_NAME"))
            Me.ATCEDITGRID.Rows.Add(atstat)
            Me.ATCEDITGRID.Rows.Add(row("AT_REMARK"))
        Next row
        ATCEDITGRID.TopLeftHeaderCell.Value = "Sr.No."
        Me.ATCEDITGRID.RowHeadersDefaultCellStyle.Padding = New Padding(3)
        ATCEDITGRID.AllowUserToAddRows = False
        AddRowHeadersEdit()
        Conn.Close()
    Catch ex As OleDb.OleDbException
        MsgBox(ex.Message, MsgBoxStyle.Critical, "DB Error")
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical, "General Error")
    End Try
End Sub

コードを確認してください。そして私に解決策を教えてください

4

1 に答える 1

1

文字列を連結する SQL コマンドを作成すると、コードが 2 つの大きな問題にさらされます。

  • まず、特定のデータベースの特定のデータ型に対して間違った構文を書く可能性があります
  • 2 つ目は、コードを悪意のあるユーザーからの SQL インジェクション攻撃にさらすことです (まあ、ここでは問題にはなりませんが....)。

代わりに、パラメーター化されたクエリを作成し、フレームワーク コードが安全かつ正しい方法でデータベース エンジンとやり取りできるようにします。

したがって、次のように書く必要があります。

    Conn.Open()
    Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK " & _ 
                           "FROM ATTENDANCE WHERE AT_DATE = ? ORDER BY EMP_NAME ASC"
    Dim da As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(strSQL, Conn)
    da.SelectCommand.Parameters.AddWithValue("@p1", DTPEDITAT.Value)
    Dim ds As DataSet = New DataSet
    da.Fill(ds, "ATTENDANCE")

コードを見ると、フィールド AT_STATUS の値を処理する方法で別の潜在的なエラーが発生する可能性があります。あなたのコードから、フィールドのタイプは decimal または double のようです。コードがコンパイルされる場合、おそらくOPTION STRICTが OFF に設定されています。このオプションをオンのままにし、データ型を適切に変換することをお勧めします

    Dim dt As DataTable = ds.Tables("ATTENDANCE")
    Dim row As DataRow
    Dim atstat As String
    Dim status as Decimal

    For Each row In dt.Rows
        status = Convert.ToDecimal(row("AT_STATUS"))
        If status = 1 Then
            atstat = "Present"
        ElseIf status  = 0 Then
            atstat = "Absent"
        ElseIf status  = 0.5 Then
            atstat = "Halfday"
        Else
            atstat = "Error"
        End If
        ......
    Next row
于 2013-05-01T07:18:28.623 に答える