Winform日期搜索和2个日期时间选择器访问数据库

时间:2018-10-02 18:15:29

标签: c# winforms ms-access

我有带有2个日期时间选择器的Winform,可以在Access数据库中搜索日期范围。

直到今天,一切都运转良好。当我从18/9/24到10/1/18进行搜索时,没有任何结果。

我猜的原因是数据库的数字顺序。

示例:日期是根据组成该值的各个数字而不是数字值进行排序的。例如,值10/1/18出现在9/24/18之前。日期的“我的访问”数据库设置为“日期”。这是代码

谢谢

private void btn_Range_Search_Click_1(object sender, EventArgs e)
    {
        try
        {
            string queryString = "SELECT HotSheetID, Today, Part, Timeord, Timerec, sdock, LCCN, Requestor, Notes, Type, Shift, RunOutTime, CICSTYPE FROM ILC,Reasontype WHERE Reasontype.typeID = ILC.typeID";

            queryString += string.Format(" AND ILC.Today BETWEEN '{0}' AND '{1}' ", dt3.Text, dt4.Text);  


            loadDataGrid(queryString);


        }
        catch (Exception ex)
        {
            MessageBox.Show("You must Refresh first before you can Search again!");
            return;

        }
    }

3 个答案:

答案 0 :(得分:0)

请勿使用+ string参数来构建查询

因此,将代码重写为如下所示(我将编写整个SQL函数,因此您将基于它重写loadDataGrid

 using(SqlConnection con = new SqlConnection("connectionString"))
{
    con.Open();
    using(SqlDataAdapter da = new DataAdapter("SELECT HotSheetID, Today, Part, Timeord, Timerec, sdock, LCCN, Requestor, Notes, Type, Shift, RunOutTime, CICSTYPE FROM ILC,Reasontype WHERE Reasontype.typeID = ILC.typeID AND ILC.Today BETWEEN COALESCE(@date1, ILC.Today) AND COALESCE(@date2, ILC.Today)")
    {
        da.SelectCommand.Parameters.AddWithValue("@date1", dt3.Text); //Like this we pass parameters to query. In case of dates it will transform your date to correct format.
        da.SelectCommand.Parameters.AddWithValue("@date2", dt4.Text); //Like this we pass parameters to query. In case of dates it will transform your date to correct format.

        DataTable dt = new DataTable();
        da.Fill(dt);

        //rest of the code
    }
}

正如您在query text中看到的那样,我使用了Coalesce

The COALESCE() function returns the first non-null value in a list.

现在,如果我们在C#中使用SomeColumn = COALESCE(@ID, SomeColumn)作为条件,我们将像这样“写”(我这样做是为了让您理解函数)

SomeColumn = (FirstValueInCoalesceFunction != null) ? firstValue : secondValue;

现在,这是short conditional operator,它表示Coalesce的工作方式,如果我们将null作为@ID的参数,它将说SomeColumn = SomeColumn,它将始终为{ {1}}。

此外,最好使用TRUE代替yourDateTimePicker1.Value(如果它是textBox但我想是)

答案 1 :(得分:0)

要回答您的问题-将正确的格式应用于日期值:

queryString += string.Format(" AND ILC.Today BETWEEN '{0}' AND '{1}' ", dt3.Value.ToString("#yyyy'/'MM'/'dd#"), dt4.Value.ToString("#yyyy'/'MM'/'dd#"));  

也就是说,使用参数。维护和调试容易得多。

答案 2 :(得分:0)

这对我有用。我会记住,并使用Parmameter进行更好的编码。

string queryString =“ SELECT HotSheetID,今天,零件,Timeord,Timerec,sdock,LCCN,请求者,注释,类型,Shift,RunOutTime,来自ILC的CICSTYPE,原因类型WHERE Reasontype.typeID = ILC.typeID和ILC.Today之间#“ + dt3.Value.ToShortDateString()+”#和#“ + dt4.Value.ToShortDateString()+”#“;