在代码隐藏条件下构建查询的最佳方式

本文关键字:最佳 方式 查询 构建 代码 隐藏 条件下 | 更新日期: 2023-09-27 18:12:48

如何使这段代码正确?我对这段代码不满意,我迷路了。

我给你一个简单的例子,但查询更复杂。

提前感谢。

string aValue;
string queryA;
string queryB;
string finalQuery;
string queryA = @"SELECT column1 FROM table1 WHERE column1=";
queryA += aValue;
string queryB = @"SELECT column1, column2,"
if (aValue == "all"){
   queryB += @"column3";
}
queryB += @"FROM table1 WHERE column1=";
queryB += @"'" +aValue+ "'";
private void exportExcel(){
     // change the value with a dropdownlist
     if (ddlType.selectedIndex(1))
          aValue = "typeA";
     else if(ddlType.selectedIndex(2))
          aValue = "typeB";
     else
         aValue = "all";
     // select the query
     if (aValue == "typeA")
         finalQuery = queryA;
     else if (aValue == "typeB")
         finalQuery = queryB;
     ExecQUery(finalQuery);
}

在代码隐藏条件下构建查询的最佳方式

在Java和c#(以及几乎任何其他平台)中,您绝对应该直接在SQL中包含值。这为SQL注入攻击开辟了道路,也使得处理日期、时间和数字的格式变得棘手。

相反,您应该使用参数化的 SQL,在参数中指定值。在Java和c#之间,实现方法不同,但原理是相同的。

两个平台上的另一种方法是使用某种描述的ORM,而不是手工构建查询。例如,在。net中,您可能希望使用某种描述的LINQ提供程序,而在Java中,您可能希望使用Hibernate之类的东西。无论哪种方式,您都可以在比原始SQL更高的抽象级别上表达您的查询。

如果不知道你真正使用的是什么平台(或数据库),也没有真正的查询,很难给出更具体的建议。

你可以做的一个小改变是将下拉列表的value属性设置为typeA,TypeB等。并且去掉初始if条件和变量

,

if(ddlType.selectedValue.toString()=="typeA")
   finalQuery = queryA;
if(ddlType.selectedValue.toString()=="typeB")
   finalQuery = queryB;

我通常从资源文件加载它。这使您可以自由地更改查询(这是在不需要使用if块动态生成查询的情况下)。在源代码中,我使用格式结束我的行与注释行,以避免我的IDE连接或把它们放在一个像像:

String sql = "select " + //
    "  * " + //
    "from "+ //
    "  employee " + //
    "where " + //
    "      salary > :minSal " + //
    "  and startDate > :minStartDate";

在条件部分的情况下,我只是添加了一个if块。但是对于语句,我只添加一个默认的"1=1",以便继续进行额外的限制,所以如果没有额外的限制,查询仍然有效。假设下面SQL中的两个where语句都是有条件添加的:

String sql = "select " + //
    "  * " + //
    "from "+ //
    "  employee " + //
    "where 1 = 1 ";

在此之前,您的基本SQL是有效的,这意味着如果没有添加条件,它仍然是有效的。

假设你将添加工资限制,以防万一它被告知:

if (salary != null) {
    sql += "and salary > :minSalary";
    parameters.put("minSalary", salary);
}

正如您所看到的,在相同的条件下,我向SQL添加了一个新的表达式,并向映射添加了一个参数,这些参数将在稍后的执行中用于为查询设置参数,这避免了您创建第二个if语句来设置这个参数。

另一种方法是构建整个SQL,并在执行之前询问准备好的语句需要哪些参数作为输入并提供它们。在java中,你可以这样做:http://download.oracle.com/javase/1.4.2/docs/api/java/sql/PreparedStatement.html getParameterMetaData % 28% 29日

我知道情况并非如此,但如果使用ORM,通常会有用于查询的生成器,这会使任务变得更容易,例如在Hibernate中,您可以这样做:

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "F%")
    .addOrder( Order.asc("name") )
    .addOrder( Order.desc("age") )
    .setMaxResults(50)
    .list();

如文件所示:http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html

这意味着你可以这样做:

Criteria c = sess.createCriteria(Cat.class)
    .addOrder( Order.asc("name") )
    .addOrder( Order.desc("age") )
    .setMaxResults(50);
if (name != null) {
    c.add( Restrictions.like("name", name);
}
List cats = c.list();