查询中的语法错误缺少运算符表达' doj> =#03 / Jan / 2016和' doj< =#03 / Jan / 2016'。
this->y
答案 0 :(得分:2)
在这一行
SQL = "... Where doj >=#" & DateTimePicker1.Text & " # and <=#" & DateTimePicker2.Text "#"
在字符串的doj
部分之前没有<=#
字段,并且没有&
符号将最后#
连接到上一个字符串。
说,你应该忘记这种查询数据库的方式 正确的方法是通过这里的参数
SQL = "select * from tbluser Where doj >= @p1 and doj <= @p2"
acscmd = New OleDbCommand(SQL, acsconn)
acscmd.Parameters.Add("@p1", OleDbType.Date).Value = DateTimePicker1.Value.Date
acscmd.Parameters.Add("@p2", OleDbType.Date).Value = DateTimePicker2.Value.Date
acsdr = acscmd.ExecuteReader
.....
此查询使用参数,它不受Sql注入的约束,参数以查询中涉及的列所期望的正确数据类型传递,不会因命令文本中的串联而导致混淆。
修改强>
按照下面的评论,如果您想知道两个日期之间具有doj值的行数,那么您应该更改查询并引入scalar function COUNT
SQL = "select COUNT(*) from tbluser Where doj >= @p1 and doj <= @p2"
acscmd = New OleDbCommand(SQL, acsconn)
acscmd.Parameters.Add("@p1", OleDbType.Date).Value = DateTimePicker1.Value.Date
acscmd.Parameters.Add("@p2", OleDbType.Date).Value = DateTimePicker2.Value.Date
Dim result as Integer = acscmd.ExecuteScalar
.....
该命令执行方法ExecuteScalar而不是ExecuteReader,因为只有COUNT函数计算的值才能返回,而不是整个数据记录。