我在名为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我在页面上有如此多的过滤器,如学校,批次和学术年份。
提前致谢。
答案 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字符串。 也许你应该找到一个关于构建数据访问层的例子。