Скрыть тег на основе значения набора записей NULL

Я использую хранимую процедуру Microsoft SQL Server 2005 для публикации записей в таблице HTML. В таблице HTML у меня есть строки для следующих полей: запись №, дата открытия, описание и владелец.

Иногда поле владельца в таблице базы данных будет иметь значение NULL. Когда это происходит, у меня ASP response.write "N / A" в строке таблицы HTML, соответствующей владельцу. Однако я бы хотел этого избежать, так как это кажется излишним. Вместо этого я надеюсь, что есть способ полностью исключить эту строку таблицы, если в db указано поле владельца 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    
6.11.2009 19:23:09
4 ОТВЕТА
РЕШЕНИЕ

Лучше всего отфильтровывать строки, содержащие значения NULL, в самом запросе SQL, но если по какой-то причине вы не можете этого сделать, просто немного переместите оператор IF вверх, чтобы, если условие не выполнено, строка таблицы не записывалась в первое место:

<% If (RS ("OwnerName")) <> "" Then Response.Write ("<tr> <td>" & "</ td> </ tr>")%>

1
6.11.2009 19:39:05
@baldwingrand: Если этот ответ вы приняли, то вам нужно подтвердить свое согласие, нажав на большую галочку слева.
AnthonyWJones 7.11.2009 15:46:50

Конечно, лучше фильтровать источник, просто выбирая записи, для которых 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%>

Не проверял код, но он должен помочь.

1
6.11.2009 19:41:50

Вы можете сделать это двумя способами.

1) Внешний интерфейс: проверьте значения NULL в поле «Владелец» следующим образом.

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

2) Бэкэнд:

Отфильтруйте значения NULL в вашей хранимой процедуре, используя предложение WHERE .

0
6.11.2009 19:45:31

Так как вы «абсолютный новичок», вот несколько советов.

Атака 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 Injection ASP"

Значение NULL

Вы, кажется, немного запутались в значении NULL. msgstr "поле владельца в таблице базы данных будет NULL", но ваш код проверяет <> "". Null - это не то же самое, что пустая строка. Поле, которое фактически равно NULL, не будет равно "".

Использовать Server.HTMLEncode

Ваш код:-

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

Что произойдет, если поле Description содержит символ <или &? Хуже того, если данные в поле «Описание» ориентированы на ввод данных в веб-клиентах, они могут содержать попытки внедрения Javascript. Всегда используйте Server.HTMLEncode для строковых данных, отправляемых клиенту: -

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

Ваш актуальный вопрос

Не поддавайтесь искушению использовать VBScript на своей странице ASP для выполнения работы, которую должен выполнять SQL. Модифицируйте свой SQL с помощью предложения WHERE:

 WHERE Owner IS NOT NULL

или если вы не уверены, будет ли Owner NULL или пустая строка: -

WHERE Owner IS NOT NULL AND Owner <> ""
5
7.11.2009 15:42:52