在VS2017中,我从Access accdb文件中提取日期以显示在ReportViewer中。但是,无论我在变量中输入什么内容,我所有的日期查询都会提取每个日期中的所有字段。
这是输入格式和var run
SignupDateStart.Format = DateTimePickerFormat.Custom
SignupDateStart.CustomFormat = "MM / dd / yyyy"
Dim strSignupDateStart As String = SignupDateStart.ToString
strSignupDateStart = lblStartDate.Text
SignupDateEnd.Format = DateTimePickerFormat.Custom
SignupDateEnd.CustomFormat = "MM/dd/yyyy"
Dim strSignupDateEnd As String = SignupDateEnd.ToString
strSignupDateEnd = lblEndDate.Text
frmSignupReportQuery2.getFilterValues(strSignupDateStart, strSignupDateEnd)
这是getFilterValues
子:
Public Shared Sub getFilterValues(ByVal date1 As String, ByVal date2 As String)
Try
frmSignupReportQuery2.MemberBaseTableAdapter.
FillBy(frmSignupReportQuery2.DataSet2.MemberBase, date1, date2)
Catch ex As Exception
End Try
End Sub
这是我用于数据集2的查询
SELECT ID, ccnumberexp, EntireName, address, stateinit, zip, age, email, ccnumber, SignupDate, MemberTypes
FROM MemberBase
WHERE SignupDate BETWEEN #?# AND #?#
这是一个学校项目,因此任何漏洞都不是问题。任何帮助表示赞赏。
编辑1
这是vb.net代码
Public strMembershipType As String = ""
Public strMembershipTypeNum As String = ""
SignupDateStart.CustomFormat = "MM/dd/yyyy"
SignupDateStart.Format = DateTimePickerFormat.Custom
strSignupDateStart = Convert.ToDateTime(SignupDateStart.Value)
MessageBox.Show(strSignupDateStart)
SignupDateEnd.CustomFormat = "MM/dd/yyyy"
SignupDateEnd.Format = DateTimePickerFormat.Custom
strSignupDateEnd = Convert.ToDateTime(SignupDateEnd.Value)
MessageBox.Show(strSignupDateEnd)
frmSignupReportQuery2.getFilterValues(strSignupDateStart, strSignupDateEnd)
frmSignupReportQuery2.Show()
我现在收到一个“ InvalidCastException:从字符串“”到类型“日期”的转换无效。” strSignupDateStart = Convert.ToDateTime(SignupDateStart.Value) 行
这是修改后的查询
SELECT ID, ccnumberexp, EntireName, address, stateinit, zip, age, email,
ccnumber, SignupDate, MemberTypes
FROM MemberBase
WHERE SignupDate BETWEEN ? AND ?
编辑2
我上的课不是编程课程,而是系统设计和项目分析。我的老师不知道该怎么做。我班上的大多数其他人正在混合使用MSaccess。我希望有人向我展示如何在数据集中进行参数化查询,但是我会做的。这是我当前的实现。
Try
SignupQuery.ReportViewer1.Clear()
SignupQuery.getFilterValues(SignupDateStart.Value, SignupDateEnd.Value)
SignupQuery.ReportViewer1.RefreshReport()
SignupQuery.Show()
Catch ex As Exception
End Try
Public Shared Sub getFilterValues(ByVal date1 As Date, ByVal date2 As Date)
Try
这是子过程:
SignupQuery.MemberBaseTableAdapter.FillBy(SignupQuery.DataSet2.MemberBase,
date1, date2)
Catch ex As Exception
End Try
end sub
我感谢大家的投入。
答案 0 :(得分:1)
首先,请使用参数。是否上学,无论如何都要迟早要学。
但是,如果您坚持串联,您的代码可以简化为:
strSignupDateStart = SignupDateStart.Value.ToString("#yyyy'/'MM'/'dd#")
MessageBox.Show(strSignupDateStart)
strSignupDateEnd = SignupDateEnd.Value.ToString("#yyyy'/'MM'/'dd#")
MessageBox.Show(strSignupDateEnd)
frmSignupReportQuery2.getFilterValues(strSignupDateStart, strSignupDateEnd)
frmSignupReportQuery2.Show()
这将选择DateTimePickers的真实DateTime值,并使用Access SQL理解的格式将它们转换为字符串表达式:#yyyy/mm/dd#
答案 1 :(得分:0)
不要将日期转换为字符串。如果您发现自己将日期转换为字符串以用于SQL数据库,则说明您做错了什么。
部分原因是安全性问题,但这也使事情变得更容易。依靠数据集和ADO.Net的功能来处理SQL日期的格式。给他们一个.Net DateTime值,他们已经知道如何转换它以确保它正是您的数据库所需要的。这也可以很好地避免您遇到的问题。但这是为了上学,我希望看到您在向我展示任何代码之前做出自己的尝试。
我也对此感到奇怪:
Dim strSignupDateStart As String = SignupDateStart.ToString
strSignupDateStart = lblStartDate.Text
这:
Dim strSignupDateEnd As String = SignupDateEnd.ToString
strSignupDateEnd = lblEndDate.Text
在两种情况下,您都将新的字符串变量初始化为DatePicker控件中的值,然后立即用标签中的值覆盖该字符串变量,以使上一行的初始化无效。