C# 基于c方法可选参数构建的SQL查询

C# 基于c方法可选参数构建的SQL查询,c#,sql,sql-server,C#,Sql,Sql Server,我有一个应用程序,我需要允许用户能够选择月/年/用户,然后使用这些结果执行SQL查询。让我感到困惑的是,我希望每个参数都是可选的 因此,如果我选择了一个用户,但没有日期信息,我希望看到该用户所有时间的结果。如果我只选择一个月,我想显示该月的当前年份,等等。我让它使用以下代码与月/用户一起工作: protected void btnView_Click(object sender, EventArgs e) { gvbind(Convert.ToInt32(ddlM

我有一个应用程序,我需要允许用户能够选择月/年/用户,然后使用这些结果执行SQL查询。让我感到困惑的是,我希望每个参数都是可选的

因此,如果我选择了一个用户,但没有日期信息,我希望看到该用户所有时间的结果。如果我只选择一个月,我想显示该月的当前年份,等等。我让它使用以下代码与月/用户一起工作:

    protected void btnView_Click(object sender, EventArgs e)
    {
        gvbind(Convert.ToInt32(ddlMonth.SelectedValue), ddlWebmasters.SelectedValue.ToString(), Convert.ToInt32(ddlYear.SelectedValue));
    }

    protected void gvbind(int month = 0, string user = "")
    {
        string query = "Select * from WebLogs w inner join(select max(ID) as id, username from WebLogs group by Username) w2 on w.id = w2.id and w.Username = w2.username where Year(LogEntryDate) = year(getDate())";

        if (user.Length > 0 && month > 0)
        {
            query = "SELECT * FROM [WebLogs] WHERE ([Username] = '" + user + "') AND month(LogEntryDate) =" + month + " AND year(LogEntryDate) = year(getdate()) ORDER BY [ID]";
        }
        else if (user.Length > 0 && month == 0)
        {
            query = "SELECT * FROM [WebLogs] WHERE ([Username] = '" + user + "') AND year(LogEntryDate) = year(getdate()) ORDER BY [ID]";
        }
        else if (user.Length == 0 && month > 0)
        {
            query = "SELECT * FROM [WebLogs] WHERE month(LogEntryDate) =" + month + "AND year(LogEntryDate) = year(getdate())  ORDER BY [ID]";
        }

这会将查询传递到一个SqlCommand,但现在我添加了year,这真的很低效,我知道必须有一种简单的方法来处理这个问题。

使用参数!搜索SQL注入或使用LINQ,在LINQ中,您可以更轻松地组合查询……您可以阅读本文,其中解释了如何处理这种类型的“一网打尽”查询,从而避免SQL注入带来的安全性和快速性。您将从何处获取数据,即txtbox.Text,因为我们需要看到它才能编写新代码?添加了调用包含我的sql查询的函数的onclick。从下拉列表中填充。使用参数!搜索SQL注入或使用LINQ,在LINQ中,您可以更轻松地组合查询……您可以阅读本文,其中解释了如何处理这种类型的“一网打尽”查询,从而避免SQL注入带来的安全性和快速性。您将从何处获取数据,即txtbox.Text,因为我们需要看到它才能编写新代码?添加了调用包含我的sql查询的函数的onclick。它从下拉列表中填充。
protected void gvbind(int month = 0, string user = "")
    {
        //string query = "Select * from WebLogs w inner join(select max(ID) as id, username from WebLogs group by Username) w2 on w.id = w2.id and w.Username = w2.username where Year(LogEntryDate) = year(getDate())";

        string query = string.Empty;
        query = "SELECT * FROM [WebLogs] WHERE "+((user.Length>0)?"([Username] = '" + user + "') AND ":"") +   ((month>0)?" month(LogEntryDate) =" + month+ "AND ":"") + " year(LogEntryDate) = year(getdate()) ORDER BY [ID]";

    }