我正在使用名为stockitems的ms访问表, 表结构是......
stdate stitems
01-04-2015 Red
02-04-2015 Blue
08-04-2015 Green
01-05-2015 Grey
02-05-2015 Violet
09-05-2015 Purple
04-06-2015 Sky Blue
我使用以下代码从该表中选择记录......
Dim report As New CrystalDecisions.CrystalReports.Engine.ReportDocument
Dim xs, xs2, cmp As String
xs = date1.Text
xs2 = date2.Text
cmp = salsqkrpt.salcom.Text
Dim cmd1 As OleDbCommand = New OleDbCommand("SELECT * from stockitems where stdate between '" & date1.Text & "'and '" & date2.Text & "'",con)
myDA = New OleDbDataAdapter(cmd1)
myDataSet = New DataSet()
myDA.Fill(myDataSet, "stockitems ")
report.Load(Application.StartupPath & "\stockreport.rpt")
report.SetDataSource(myDataSet.Tables("stockitems "))
stckreport.CrystalReportViewer1.ReportSource = report
此处date1 and date2 was masked textbox
,掩码为00-00-0000 (DD-MM-YYYY)
在排除此代码时,报告仅从前两个字符串中获取仅dd
,当我分配date1=01-04-2015
和date2=03-05-2015
时,结果就像......
stdate stitems
01-04-2015 Red
02-04-2015 Blue
01-05-2015 Grey
02-05-2015 Violet
but my expected result is
stdate stitems
01-04-2015 Red
02-04-2015 Blue
08-04-2015 Green
01-05-2015 Grey
02-05-2015 Violet
它没有作为日期工作,请帮助我解决这个问题开发人员,我是vb.net的初学者。提前谢谢。
答案 0 :(得分:4)
MS / Access将日期解释为mm / dd / yy,因此您从1月4日开始选择数据 - > 3月5日。在SQL中将日期重新格式化为mm-dd-yyyy。一般来说,Ms / Access实际上需要格式为#mm / dd / yyyy#的日期文字(即使用#')。
Dim dtDate1 as DateTime = DateTime.Parse(date1.text)
Dim dtDate2 as DateTime = DateTime.Parse(date2.text)
Dim cmd1 As OleDbCommand = New OleDbCommand("SELECT * from stockitems where stdate Between #" & _
dtDate1.ToString("MM/dd/yyyy") & "# And #" & _
dtDate2.ToString("MM/dd/yyyy") & "#",con)
您的代码让您对SQL注入开放。首先验证日期,然后将它们作为参数传递或使用DataTime变量格式化SQL(上图)。
答案 1 :(得分:2)
您需要在SQL中使用格式正确的日期表达式:
concat $ transpose [[1,2,3],[4,5,6]]
答案 2 :(得分:0)
日期的MS Access内部存储格式为美国默认值:MM / DD / YYYY 如果你的windows语言环境日期格式是DD / MM / YYYY,就像在欧洲一样,你应该在查询你的日期之前做一个format()。
因此,您的查询应为:
Dim cmd1 As OleDbCommand = New OleDbCommand("SELECT * from stockitems where stdate between #" & format(date1.Text,"MM/DD/YYYY") & "# and #" & format(date2.Text,"MM/DD/YYYY") & "#",con)
或与 - 分隔符一样:
Dim cmd1 As OleDbCommand = New OleDbCommand("SELECT * from stockitems where stdate between #" & format(date1.Text,"MM-DD-YYYY") & "# and #" & format(date2.Text,"MM-DD-YYYY") & "#",con)
答案 3 :(得分:0)
在MS-ACCESS或SQL中,日期字段的数据类型应为日期/时间。那些格式应为“DD / MM / YYYY”然后我们不需要更改标准代码......