2009-11-06 27 views
1

我正在使用Microsoft SQL Server 2005存储过程在HTML表中发布记录。在HTML表格中,我有以下字段的行:entry#,打开日期,描述和所有者。隐藏<TR>基于Recordset的标记NULL值

有时,db表中的owner字段将为NULL。发生这种情况时,我在对应于所有者的HTML表格行中有ASP response.write“N/A”。不过,我想避免这种情况,因为它看起来多余。相反,我希望有一种方法可以在数据库中的所有者字段为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  

回答

1

这是最好的过滤掉包含在SQL查询本身NULL值的行,但如果你因为某些原因,只是将你的IF语句了一下所以如果条件不满足,不表行首先写出:

<%如果(RS( “OWNERNAME”))<> “” 然后回复于( “<TR> <TD>” &“</TD > </tr >“)%>

+0

我选择了做这个选项。精美的作品。谢谢! – SeanFlynn 2009-11-06 20:35:45

+0

@baldwingrand:如果这是你接受的答案,那么你应该通过点击左边的大勾来表明你的接受。 – AnthonyWJones 2009-11-07 15:46:50

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%> 

未测试代码,但它应该帮助。

0

你可以用两种方法做到这一点。

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

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

2)后端:在您的存储过程

过滤NULL值使用WHERE子句

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表中的所有者字段将为NULL”,但您的代码正在测试<>“”。空不与空字符串相同。实际上NULL的字段不会等于“”。

使用Server.HTMLEncode

您的代码: -

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

如果说明字段包含<&字符会发生什么?更糟糕的是,如果说明字段中的数据来自Web客户端上的数据输入,它可能包含Javascript注入尝试。始终使用的字符串数据Server.HTMLEncode被发送到客户端: -

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

您的实际问题

不要受到诱惑而使用VBScript在ASP页面做的工作是SQL应正在做。 Modifiy您的SQL用WHERE子句: -

WHERE Owner IS NOT NULL 

,或者如果你不知道老板是否会NULL或空字符串: -

WHERE Owner IS NOT NULL AND Owner <> ""