缺少操作员帮助VB

时间:2016-01-03 18:13:46

标签: vb.net ms-access

  
    

查询中的语法错误缺少运算符表达' doj> =#03 / Jan / 2016和' doj< =#03 / Jan / 2016'。

  
this->y

1 个答案:

答案 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函数计算的值才能返回,而不是整个数据记录。