经典ASP页面上的SQL查询中的条件语句

时间:2017-04-17 11:22:58

标签: sql sql-server sql-server-2008 asp-classic

我在名为123.asp的页面中提取了三个值 (123.asp学校= NewEnglishSchool&安培;批次= 1&安培; AcademicYear = 2)

School = Request.QueryString("School")
Batch = Request.QueryString("Batch")
AcademicYear = Request.QueryString("AcademicYear")

我在下面的表单中有一个简单的查询     strSqlData =“select * from MyTable where gender =”male“”

我需要创建一个如下所示的查询,plz指导我如何实现

如果我在页面上通过Request.QueryString找到了Batch和AcademicYear的值,除了学校以外(123.asp?Batch = 1& AcademicYear = 2)

然后我想写一个像这样的查询

strSqlData="select * from MyTable where gender="male" 
if len(AcademicYear)<>o then 
and AcademicYear='"&AcademicYear&"'

elseif len(Batch)<>o then 
and Batch='"&Batch&"'
end if  

elseif len(School)<>o then 
and School='"&School&"'
end if  "

我想创建类似上面的东西,但是在没有使用案例的情况下使用正确的方法,bcoz我在页面上有如此多的过滤器,如学校,批次和学术年份。

提前致谢。

3 个答案:

答案 0 :(得分:1)

在VBScript中,您可以使用&符号(&amp;)来连接字符串。试试这个:

strSqlData="select * from MyTable where gender='male'" 

if AcademicYear <> "" then 
strSqlData= strSqlData & " and AcademicYear=" & AcademicYear
end if

if Batch <> "" then
strSqlData= strSqlData & " and Batch=" & Batch    
end if  

if School <> "" then 
strSqlData= strSqlData & " and School=" & School
end if  

你有三个单独的“和”子句附加到你的SQL查询。条件语句彼此独立,因此您不应该使用elseif来表示单个条件语句中的不同选项。检查字符串是否为空if stringname <> ""比使用len更简单,(我怀疑您的条件语句是否有效,因为您似乎使用了小写字母“o”应该使用零)

当您组装这样的SQL查询时,很容易出错。在测试中,在尝试执行它之前添加类似Response.Write strSqlData的行通常是值得的,以检查查询是否是您想要的

正如其他评论所暗示的那样,您的代码很容易受到SQL注入攻击。包含“.asp?”的网址几乎可以保证迟早会受到ASPROX类型的攻击。参数化查询是防范此问题的最佳方法,但如果您的查询字符串值全部为数字,则一种快速方法是使用cint() - 例如

strSqlData= strSqlData & " and AcademicYear=" & cint(AcademicYear)

如果查询字符串包含除数字之外的任何内容,则会抛出类型不匹配错误,并且在尝试执行sql查询之前脚本将会崩溃。

答案 1 :(得分:0)

您可以创建一个存储过程,并使用查询字符串中的必需参数在ASP页面上调用它,而不是在您的asp页面中创建一个SQL查询。

以下是我根据您的问题场景创建的示例SP

CREATE PROCEDURE Sp_fetch_data @school       VARCHAR(max), 
                               @batch        VARCHAR(max), 
                               @academicYear VARCHAR(max) 
AS 
  BEGIN 
      SET @school = (SELECT CASE 
                              WHEN @school = '' THEN NULL 
                              ELSE @school 
                            END) 
      SET @batch = (SELECT CASE 
                             WHEN @batch = '' THEN NULL 
                             ELSE @batch 
                           END) 
      SET @academicYear = (SELECT CASE 
                                    WHEN @academicYear = '' THEN NULL 
                                    ELSE @academicYear 
                                  END) 

      SELECT * 
      FROM   mytable 
      WHERE  gender = 'male' 
             AND school = @school 
             AND batch = @batch 
             AND academicyear = @academicYear 
  END 

现在只需在ASP页面中调用此SP:

strSqlData = "sp_fetch_data'"&Request.QueryString("school")&"','"&Request.QueryString("batch")&"','"&Request.QueryString("academicYear")&"'"

编辑:使用NULL数据执行存储过程

ALTER PROCEDURE Sp_fetch_data @school       VARCHAR(max) = NULL, 
                              @batch        VARCHAR(max) = NULL, 
                              @academicYear VARCHAR(max) = NULL 
AS 
  BEGIN 
      SELECT * 
      FROM   mytable 
      WHERE  gender = 'male' 
             AND ( @school = school 
                    OR @school IS NULL ) 
             AND ( @batch = batch 
                    OR @batch IS NULL ) 
             AND ( @academicYear = academicyear 
                    OR @academicYear IS NULL ) 
  END 

答案 2 :(得分:-3)

您应该将问题仅视为字符串创建。您必须创建一个将是正确的SQL查询的字符串。 您尝试过的方法想要创建包含逻辑语句的查询。而不是那样,您应该以创建正确的SQL查询的方式编写C#代码。

举个例子,让我们来看你的查询的第一部分:

strSqlData="select * from MyTable where gender="male" 
if len(AcademicYear)<>o then 
and AcademicYear='"&AcademicYear&"'

您可以轻松地将其传输到适合的C#解决方案:

    string strSqlData;
    int AcademicYear = 1994;
    int o = 2000;
    string male = "male";

    strSqlData="select * from MyTable where gender= " + male;

    if (AcademicYear != o)
        strSqlData += " and AcademicYear=" + AcademicYear.ToString();

    Console.WriteLine(strSqlData);

实际上,在您修复了代码的这一部分之后,还有一些额外的工作要做。例如,您应该使用参数化查询而不是硬编码sql字符串。 也许你应该找到一个关于构建数据访问层的例子。