Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 使用日期时间选择器从sql数据库读取数据_Vb.net_Sql Server 2005_Datagridview_Datetimepicker - Fatal编程技术网

Vb.net 使用日期时间选择器从sql数据库读取数据

Vb.net 使用日期时间选择器从sql数据库读取数据,vb.net,sql-server-2005,datagridview,datetimepicker,Vb.net,Sql Server 2005,Datagridview,Datetimepicker,如何使用datetimepicker值从数据库读取数据。我的表单中有一个datetimepicker和一个datagridview。我想从Sql数据库表中获取具有所选datetimepicker值的数据。我尝试使用此代码 Private Sub BTNFIND_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTNFIND.Click getConnect() Dim editda

如何使用datetimepicker值从数据库读取数据。我的表单中有一个datetimepicker和一个datagridview。我想从Sql数据库表中获取具有所选datetimepicker值的数据。我尝试使用此代码

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没有显示任何内容,也没有错误…

尝试在%附近移动一个空格,我更正了查询。试着弄清楚

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"
我不推荐的解决方案:

删除括号和%个字符。在顺序前加一个空格,尽管这不是语法错误的原因

通过以下方式修复选择:

"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参数placeholder中的注释:

挑选 EMP_ID、EMP_名称、AT_状态、AT_出席备注,其中AT_日期=@editDate ORDER BY EMP_名称ASC

然后只需将参数添加到SqlCommand中。最简单的方法就是使用

yourSqlCommand.Parameters。AddWithValue@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参数

命令对象使用参数将值传递给SQL语句或 存储过程,提供类型检查和验证。不像 命令文本,参数输入被视为文字值,而不是 可执行代码。这有助于防范SQL注入攻击,尤其是 攻击者在SQL语句中插入命令 损害服务器上的安全性。除了安全之外 优点:参数化命令为组织传递到数据源的值提供了一种方便的方法


我们每天都在这里看到这些问题。它们来自同一个问题

切勿使用字符串连接来生成SQL查询

这是个大问题。当然,您已经遇到了第一个效果。如何以可接受的方式将字符串转换为有效的数据类型?您需要通过嵌入引号、正确表示基础数据库系统的日期和十进制数来解决解析问题。但是字符串连接的第二个也是更微妙的副作用是,这只是一个有指导意义的链接,因为SQL注入是一个非常大的主题

要解决这类问题,唯一可接受的方法是使用参数。 这意味着是数据库引擎以一种高效的方式解决了这个问题,您需要一个带有参数占位符@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

我像这样修改代码

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工作正常….

这是我的代码,它工作正常


oldbc.CommandText=从recette where&ComboBox1.Text&between&DateTimePicker1.Text&and&DateTimePicker2.Text&

谢谢朋友。感谢您的快速重播。但另一个错误转换失败时,转换日期时间从字符字符串我修改了我的答案。。请检查日期的正确格式检查我的答案。。但是小心我的朋友。因为您的查询易于sql注入:显示类型Date不是已定义的系统类型。但我将CASTAT_DATE更改为DATE,将CASTAT_DATE更改为DateTime。现在没有显示任何错误。但无法获取任何数据。好的,请尝试将CASTAT_DATE作为DateTime更改为ConvertVarchar10,OrderDate,23Dim editdate作为DATE editdate=DTPEDITAT。值aditdate不是来自数据库。仅限DateTimePicker。如果您使用的是属性的此字段,其值已经是DateTime,并且您的数据库列类型为DateTime,那么也不要考虑将日期转换为字符串之类的内容,只需使用sql参数并将DateTime值直接添加到参数中即可。+1,实际上这个答案有一点D、 我只是想找个直人answer@Thanzeem你现在有完整的样品了。试着让我们know@Thanzeem,Steve先生已经解释了参数。AddWithValue+1,但OP的问题似乎是他想要一个简单的代码D@spajce我不这么认为。简单,这是最好的,但无错误应该是必须的。这样做真的是个坏习惯。当错误袭来时,你不想发现自己的裤子脱了。相信我,当你在潜在客户面前演示你的应用程序时,这个错误总是会出现。你的AT_DATE列是文本字段varchar,nvarchar吗?如果是这样,您打算如何将LIKE语句应用于表示日期的字符串?在时段之间或特定日期之后搜索?这里有一个根本性的缺陷。日期应始终存储在datetime或smalldatetime列中,否则应用这种方法几乎是不可能的logic@Steve-此表单仅用于编辑特定日期的出勤情况。如果AT_date是DateTime列,则不能像这样使用。如果只需要DateTimePicker中所选日期的人员,请使用=和DateTime类型的参数DateTimePicker.Value,如我的回答中所述。