如何使用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不显示任何内容且没有错误...
答案 0 :(得分:2)
我们每天都在这里看到这些问题。它们源于同样的问题。
永远不要使用字符串连接来构建SQL查询。
这是一个大问题。当然你已经遇到了第一个效果。如何以可接受的方式将字符串转换为有效数据类型?您需要使用嵌入式引号解决解析问题,正确表示基础数据库系统的日期和十进制数。但字符串连接的第二个更微妙的副作用是SQL Injection(这只是一个有启发性的链接,因为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
答案 1 :(得分:1)
我的 NOT WOMOMENDED 解决方案:
删除括号和%
个字符。在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
从MSDN关于Sql参数
命令对象使用参数将值传递给SQL语句或 存储过程,提供类型检查和验证。不像 命令文本,参数输入被视为文字值,而不是 可执行代码。这有助于防止“SQL注入”攻击 攻击者将命令插入到SQL语句中 危及服务器的安全性。除了安全性 优点,参数化命令提供了一种方便的方法来组织传递给数据源的值。
答案 2 :(得分:0)
尝试移动"%)
附近的一个空格,然后我更正了查询。试着搞清楚。
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"
答案 3 :(得分: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工作得很好....
答案 4 :(得分:0)
这是我的代码工作
oldbc.CommandText =“select * from recette where”& ComboBox1.Text& “介于#”之间DateTimePicker1.Text& “#和#”& DateTimePicker2.Text& “#”