C# 尽量减少条件的数量

C# 尽量减少条件的数量,c#,asp.net,sql-server,C#,Asp.net,Sql Server,尝试以下方法。我刚刚在默认查询中添加了where 1=1,因此在添加查询的其他部分时,您总是需要and 实际上,您试图优化的东西是错误的。您不应该使用字符串连接来添加列和值。您很容易受到sql注入的攻击,并且会将所有数据类型视为字符串,这可能会导致其他问题 相反,您应该使用sql参数。以下是一个例子: string query = "select StudentInfoId, Name, Age, State, tbl2.ClassName from tblstudentinfo tbl1 jo

尝试以下方法。我刚刚在默认查询中添加了where 1=1,因此在添加查询的其他部分时,您总是需要and


实际上,您试图优化的东西是错误的。您不应该使用字符串连接来添加列和值。您很容易受到sql注入的攻击,并且会将所有数据类型视为字符串,这可能会导致其他问题

相反,您应该使用sql参数。以下是一个例子:

string query = "select StudentInfoId, Name, Age, State, tbl2.ClassName from tblstudentinfo tbl1 join Class tbl2 on (tbl1.class = tbl2.classid) where 1=1 ";


    if (name != "")
    {
        query = query + " and name = '" + name + "' " ;
    }

    if (age != "")
    {
         query = query + " and age = '" + age + "' ";
    }

    if (state != "")
    {
          query = query + " and state = '" + state + "' ";
    }

    if (classes != "")
    {
          query = query + " and class = '" + classes + "' ";
    }

你应该把你的问题贴在上面并正确格式化。你可以进行sql注入。您应该使用sql参数和正确的数据类型,而不是字符串连接。它允许查询计划缓存,从而避免在每次执行时重新编译查询,允许键入参数以避免转换,并保护您免受格式错误和恶意sql的攻击。这个问题似乎与主题无关,因为它涉及的是已经正常工作的代码。正如其他人所建议的,应该将其迁移到。除了解决SQL注入问题外,最好也迁移到。虽然这是对原始代码的改进,但它很容易受到SQL注入的影响。相反,.+1,尽管我倾向于在查询中添加选项“重新编译”,以便在相关的地方使用索引,并优化多余的谓词。@GarethD:你说得对,它可以改进。但我只是想展示一种支持一个过滤器的方法,它可以避免太多的噪音。如果桌子不是太大,它可能足够快。值得一读:
string query = "select StudentInfoId, Name, Age, State, tbl2.ClassName from tblstudentinfo tbl1 join Class tbl2 on (tbl1.class = tbl2.classid) where 1=1 ";


    if (name != "")
    {
        query = query + " and name = '" + name + "' " ;
    }

    if (age != "")
    {
         query = query + " and age = '" + age + "' ";
    }

    if (state != "")
    {
          query = query + " and state = '" + state + "' ";
    }

    if (classes != "")
    {
          query = query + " and class = '" + classes + "' ";
    }
string query = @"SELECT StudentInfoId, Name, Age, State, tbl2.ClassName 
                 FROM   tblstudentinfo tbl1 
                 INNER JOIN Class tbl2 ON (tbl1.class = tbl2.classid)
                 WHERE (@name IS NULL OR name = @name)
                 AND   (@age IS NULL OR age = @age)
                 AND   (@state IS NULL OR state = @state)
                 AND   (@classes IS NULL OR classes = @classes)";

DataTable table = new DataTable();
using(var conn = new SqlConnection(" ... "))
using(var da = new SqlDataAdapter(query, conn))
{
    var parameters = da.SelectCommand.Parameters;
    var p = new SqlParameter("@name", SqlDbType.NVarChar);
    if(!string.IsNullOrWhiteSpace(this.name.Text))
        p.Value = this.name.Text.Trim();
    else
        p.Value = DBNull.Value;
    parameters.Add(p);

    p = new SqlParameter("@age", SqlDbType.Int);
    int age;
    if(int.TryParse(this.age.Text, out age))
        p.Value = age;
    else
        p.Value = DBNull.Value;
    parameters.Add(p);

    // ...

    da.Fill(table);
}

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