隐藏基于Recordset NULL值的标记

时间:2009-11-06 19:23:10

标签: javascript sql-server-2005 asp-classic

我正在使用Microsoft SQL Server 2005存储过程在HTML表中发布记录。在HTML表格中,我有以下字段的行:条目号,开放日期,说明和所有者。

有时,db表中的owner字段将为NULL。发生这种情况时,我有ASP响应。在与所有者对应的HTML表行中写入“N / A”。但是,我想避免这种情况,因为它似乎是多余的。相反,如果db中的owner字段为NULL,我希望有一种方法可以完全消除该表行。我该怎么做呢?我正在使用Javascript,经典ASP和SQL Server 2005.我的代码如下。注意 - 我完全是新手。感谢。

'Declare Variables
Dim CN, RS, vOutputType, vSQL, vNumber, vOwner

'Connection from includes file
Set CN = GetDataConnection

vOutputType = Request.QueryString("ot")

If Request.QueryString("txtNumber") <> "" Then
vNumber = Rtrim(Request.QueryString("txtNumber"))
End If

If Request.QueryString("cboOwner") <> "" Then
    vOwner = Rtrim(Request.QueryString("cboOwner"))
End If

If vNumber <> "" Or vOwner <> "" Then

vSQL = "spReport "
vSQL = vSQL & "@vNumber = '" & vNumber & "', "
vSQL = vSQL & "@vOwner = '" & vOwner & "'"

Set RS = CN.Execute(vSQL)

If IsObject(RS) Then
    If Not RS.EOF Then%>    
        <table class="WebApps">
            <tr>
                <td width="5%"><h3>Entry #</h3></td>
                <td width="5%"><h3>Open Date</h3></td>
                <td width="5%"><h3>Description</h3></td>
                <td width="5%"><h3>Owner</h3></td>      
            </tr>

            <%RS.MoveFirst
            Do While Not RS.EOF
                %>              
                <tr>
                    <td><p><%= RS("ID")%></p></td>
                    <td><p><%= RS("OpenDate")%></p></td>
                    <td><p><%= RS("Description")%></p></td> 
                    <td><p><%If (RS("OwnerName")) <> "" Then Response.Write(RS("OwnerName")) Else Response.Write("N/A")%></p></td>
                </tr>
                <%RS.MoveNext
            Loop%>          
        </table>    
<%End If
End If

'Close objects
Set RS = NOTHING
CN.Close
Set CN = Nothing    

4 个答案:

答案 0 :(得分:5)

既然你是“全新手”,这里有一些建议。

SQL注入攻击

您的代码: -

vSQL = "spReport "
vSQL = vSQL & "@vNumber = '" & vNumber & "', "
vSQL = vSQL & "@vOwner = '" & vOwner & "'"

Set RS = CN.Execute(vSQL)

不要这样做。有人可以创建一个查询字符串来在您的服务器上执行任意SQL: -

?txtNumber=30&cboOwner='; arbitary SQL code here ; --

您应该始终使用ADODB.Command对象来执行需要从客户端检索的参数值的SQL。网页搜索“SQL注入ASP”

NULL的含义

你似乎对NULL的含义有点困惑。 “db表中的owner字段将为NULL”,但您的代码正在测试&lt;&gt; “”。 Null与空字符串不同。实际为NULL的字段不等于“”。

使用Server.HTMLEncode

您的代码: -

<td><p><%= RS("Description")%></p></td> 

如果“说明”字段包含<&字符会怎样?更糟糕的是,如果描述字段中的数据从Web客户端上的数据条目开始,它可能包含Javascript注入尝试。始终对发送到客户端的字符串数据使用Server.HTMLEncode: -

<td><p><%= Server.HTMLEncode(RS("Description"))%></p></td> 

您的实际问题

不要试图在ASP页面中使用VBScript来完成SQL应该做的工作。 使用WHERE子句修改SQL: -

 WHERE Owner IS NOT NULL

或者如果您不确定所有者是否为NULL或空字符串: -

WHERE Owner IS NOT NULL AND Owner <> ""

答案 1 :(得分:1)

最好在SQL查询本身中过滤掉包含NULL值的行,但如果由于某种原因不能,只需将IF语句向上移动一点,如果不满足条件,则不写入表行首先是:

&lt;%If(RS(“OwnerName”))&lt;&gt;“”然后Response.Write(“&lt; tr&gt;&lt; td&gt;”&amp;“&lt; / td&gt;&lt; / tr&gt;” )%&gt;

答案 2 :(得分:1)

通过简单地选择OwnerName不是“”

的记录,过滤源代码当然更好

否则你可以使用你的代码并稍微修改

从:

<%RS.MoveFirst
Do While Not RS.EOF
        %>                              
        <tr>
                <td><p><%= RS("ID")%></p></td>
                <td><p><%= RS("OpenDate")%></p></td>
                <td><p><%= RS("Description")%></p></td> 
                <td><p><%If (RS("OwnerName")) <> "" Then Response.Write(RS("OwnerName")) Else Response.Write("N/A")%></p></td>
        </tr>
        <%RS.MoveNext
Loop%>

<%RS.MoveFirst
Do While Not RS.EOF
    If (RS("OwnerName") <> "") Then
        %>                              
        <tr>
                <td><p><%= RS("ID")%></p></td>
                <td><p><%= RS("OpenDate")%></p></td>
                <td><p><%= RS("Description")%></p></td> 
                <td><p><%= RS("OwnerName")%></p></td>
        </tr>
        <%
     End If   
     RS.MoveNext
Loop%>

没有测试过代码但它应该有用。

答案 3 :(得分:0)

你可以通过两种方式完成。

1)前端:检查所有者字段中的NULL值,如下所示。

If Not (IsNull(rsNew("Owner")) Then
      <table class="WebApps">
      ...........
End If

2)后端:

使用 WHERE 子句过滤存储过程中的NULL值。