VB.net中的SQL显示错误的日期

时间:2018-09-16 02:08:00

标签: vb.net ms-access

在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

我感谢大家的投入。

2 个答案:

答案 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控件中的值,然后立即用标签中的值覆盖该字符串变量,以使上一行的初始化无效。