我有带有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;
}
}
答案 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()+”#“;