1

datetimepicker 値を使用してデータベースからデータを読み取る方法。フォームに datetimepicker と datagridview があります。選択した datetimepicker 値を使用して、Sql データベース テーブルからデータを取得したいと考えています。私はこのコードで試します

Private Sub BTNFIND_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNFIND.Click
    getConnect()
    Dim editdate As String
    DTPEDITAT.Value= Format(DTPEDITAT.Value, "dd/MM/yyyy")
    editdate = DTPEDITAT.Value
    MessageBox.Show(editdate)
    Try
        Conn.Open()
        Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = '" & editdate & "' ORDER BY EMP_NAME ASC"
        Dim da As SqlDataAdapter = New SqlDataAdapter(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
            For x As Integer = 0 To ATCEDITGRID.Rows.Count - 1
                ATCEDITGRID.Rows(x).Cells(2).Value = row("EMP_ID")
                ATCEDITGRID.Rows(x).Cells(3).Value = row("EMP_NAME")
                ATCEDITGRID.Rows(x).Cells(0).Value = atstat
                ATCEDITGRID.Rows(x).Cells(1).Value = row("AT_REMARK")
            Next x
        Next row
    Catch ex As SqlException
        MsgBox(ex.Message, MsgBoxStyle.Critical, "SQL Error")
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical, "General Error")
    End Try
End Sub

Datagridview には何も表示されず、エラーはありません...

4

5 に答える 5

2

私たちは毎日ここでこれらの質問を目にします。それらは同じ問題から生じます。

SQL クエリを作成するために文字列連結を使用しないでください。

それは大きな問題です。もちろん、最初の効果はすでに達成しています。許容可能な方法で文字列を有効なデータ型に変換する方法は? 埋め込まれた引用符、日付の正しい表現、基礎となるデータベース システムの 10 進数を使用して解析の問題を解決する必要があります。しかし、文字列連結の 2 番目のより微妙な副作用は、SQL インジェクションです (SQL インジェクションは非常に大きなトピックであるため、これは単なる有益なリンクです)。

この種の問題を解決する唯一の方法は、PARAMETERS を使用することです。
これは、質問を効率的に解決するのはデータベース エンジンであることを意味します。パラメーター プレースホルダー (@something) を含む文字列と、パラメーターの値の正確なデータ型を含むパラメーターのコレクションが必要です。

したがって、コードはこのように変更する必要があります

Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK " + 
                       "FROM ATTENDANCE WHERE AT_DATE = @editdate " + 
                       "ORDER BY EMP_NAME ASC"
Using con = new SqlConnection("constring_here")
    con.Open()
    Using cmd = new SqlCommand(strSQL, con)
        cmd.Parameters.AddWithValue("@editdate", DTPEDITAT.Value)
        ' do whatever you want with the command '
        ' like ExecuteReader or use a DataAdapter to fill datasets'
    End Using
End Using
于 2013-02-02T09:44:56.483 に答える
1

私の推奨しない解決策:

%括弧と文字を削除します。の直前にスペースを入れてくださいORDER(ただし、構文エラーの原因ではありません)。

この方法で選択を修正します。

"SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = '" & _
editDate.ToString("yyyy-MM-dd hh:mm:ss") & _
"' ORDER BY EMP_NAME ASC"

がお勧めするのは、 SQL パラメータの使い方を学ぶことです。

クエリは次のようになります (@editDate パラメーターのプレースホルダーが内部にあることに注意してください)。

"SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = @editDate ORDER BY EMP_NAME ASC".

次に、パラメーターをに追加するだけですSqlCommand。これを行う最も簡単な方法は、SqlParameterCollection.AddWithValueを使用することです。

yourSqlCommand.Parameters.AddWithValue("@editDate", editDate)

完全なサンプル:

    Dim editDate As Date = DTPEDITAT.Value

    Using conn As New SqlConnection(YOUR_CONNECTION_STRING_HERE)
        Using cmd As SqlCommand = conn.CreateCommand()
            cmd.CommandText = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = @editDate ORDER BY EMP_NAME ASC"
            cmd.Parameters.AddWithValue("@editDate", editDate)

            adapter.SelectCommand = cmd
            adapter.Fill(ds)

            For Each row As DataRow In ds.Tables(0).Rows 
                [do whatever with the result]
            Next

        End Using
        conn.Close()
    End Using

Sql パラメータに関するMSDNから

コマンド オブジェクトは、パラメーターを使用して値を SQL ステートメントまたはストアド プロシージャに渡し、型のチェックと検証を行います。コマンド テキストとは異なり、パラメーター入力は実行可能コードとしてではなく、リテラル値として扱われます。これにより、攻撃者がコマンドを SQL ステートメントに挿入してサーバーのセキュリティを侵害する"SQL インジェクション"攻撃を防ぐことができます。セキュリティ上の利点に加えて、パラメーター化されたコマンドは、データ ソースに渡される値を整理するための便利な方法を提供します。

于 2013-02-02T09:10:08.563 に答える
0

このようにコードを変更します

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")
    editdate = DTPEDITAT.Value
    Try
        Conn.Open()
        Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS,AT_REMARK FROM ATTENDANCE WHERE AT_DATE = '" & editdate & "' ORDER BY EMP_NAME ASC"
        Dim da As SqlDataAdapter = New SqlDataAdapter(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
            Me.ATCEDITGRID.Rows.Add(row("EMP_ID"), row("EMP_NAME"), atstat, 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 SqlException
        MsgBox(ex.Message, MsgBoxStyle.Critical, "SQL Error")
    Catch ex As Exception
        MsgBox(ex.Message, MsgBoxStyle.Critical, "General Error")
    End Try
End Sub

Itz よく働いて....

于 2013-03-16T08:03:59.733 に答える
0

あなたの近くに1スペース移動してみてください"%)。クエリを修正しました。把握してみてください。

Dim strSQL As String = "SELECT EMP_ID,EMP_NAME,AT_STATUS, " + _
     "AT_REMARK FROM ATTENDANCE " + _ 
     "WHERE Convert(Varchar(10), AT_DATE, 23) = " + _
     "('" & editdate.ToString("yyyy-MM-dd") & "') ORDER BY EMP_NAME ASC"
于 2013-02-02T09:01:05.787 に答える
0

これは私のコードです

oldbc.CommandText = "select * from recette where " & ComboBox1.Text & " between #" & DateTimePicker1.Text & "# and #" & DateTimePicker2.Text & "#"

于 2015-10-11T08:23:23.100 に答える