如何使用带有文本框值的选择查询作为与数据库DATE列进行比较

时间:2018-09-29 12:03:20

标签: asp.net select sql-server-2012

我的.aspx标记:

<ajaxToolkit:CalendarExtender ID="CalendarExtender1" PopupButtonID="imgpopup" runat="server" TargetControlID="TextBox11" Format="MM-yyyy" DefaultView="Months" />

<asp:TextBox ID="TextBox11" runat="server">
</asp:TextBox>

.aspx.cs代码后面:

string text = "Textbox11.Text";

string s = "SELECT * FROM Stock WHERE MONTH(Date) = 09 AND YEAR(Date) = 2018";

SqlCommand cmd = new SqlCommand(s, conn);
SqlDataAdapter dr = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
dr.Fill(dt);

GridView1.DataSource = dt;
GridView1.DataBind();

这是我在网上到处都可以查询的查询,但是我不想指定固定日期。...我想允许用户选择文本,并根据该日期选择查询应该可以工作

因为是我的新手,请帮助我解决问题。

请原谅我是否再次问过别人以前问过的同样问题

1 个答案:

答案 0 :(得分:0)

我建议对日期范围查询使用带开始日期和结束日期的参数化查询。最好避免将函数应用于WHERE子句中的SQL Server列,因为这样会导致索引(如果有)无法有效使用。例如:

    var date = DateTime.Now;
    if(!DateTime.TryParse(Textbox11.Text, out date))
    {
        //invalid date handing
        return;
    }
    var startDate = new DateTime(date.Year, date.Month, 1);
    var endDate = startDate.AddMonths(1);

    string s = "SELECT * FROM Stock WHERE Date >= @StartDate AND Date < @EndDate;";

    SqlCommand cmd = new SqlCommand(s, conn);
    SqlDataAdapter dr = new SqlDataAdapter(cmd);
    cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = startDate;
    cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = endDate;
    DataTable dt = new DataTable();
    dr.Fill(dt);

另外,考虑指定仅包含所需列而不是SELECT *的显式列列表,因为这将减少不必要的数据传输并为SQL Server提供更多查询优化选项。

请注意,自由格式的日期解析是不明确的。最好将用户输入限制为特定的日期格式,或者使用为您执行此操作的日期选择器控件,从而允许在服务器端使用TryParseExact