ASP / VBScript "Gotchas" - PullRequest
       5

ASP / VBScript "Gotchas"

9 голосов
/ 13 ноября 2008

Я поддерживаю / улучшаю веб-приложение, написанное на классическом ASP / VBScript. Прошло около 10 лет с тех пор, как я использовал либо в повседневной работе. Я просто наткнулся на проблему, которую я бы назвал «гоча», и мне было интересно, есть ли у других похожие вещи, о которых я должен научиться знать.

Моя проблема:
Мне пришлось преобразовать столбец в таблице SQL из числа с плавающей запятой в десятичную. Оказывается, что десятичный тип не является типом, который действительно поддерживается (или хорошо поддерживается) в vbscript. Итак, следующий код:

Dim var1, var2

var1 = rs("DecimalField1").Value
var2 = rs("DecimalField2").Value

If (var1 <> var2) Then
    'Do Something'
End If

Возникла бы ошибка несоответствия типов в строке:

If (var1 <> var2) Then

После долгих поисков я обнаружил, что:

var1 = CDBL(rs("DecimalField1").Value)
var2 = CDBL(rs("DecimalField2").Value)

решает проблему. Но это не казалось очевидным, и мне потребовалось некоторое время, чтобы понять, какого черта я получаю несоответствие типов в этой строке.

Так что мой вопрос ко всем: с какими еще небольшими причудами вы сталкивались? Какие вещи в ASP / vbscript вы бы назвали «недочётами», которые я должен искать?

Ответы [ 9 ]

10 голосов
/ 22 ноября 2008

Повторяйте за мной: Все хорошие программисты VB используют Option Explicit

Он не даст вам случайно объявить новую переменную и использовать ее - тем самым отбросив все, что вы делаете.

Кроме того, это зависит от того, что вы делаете.

8 голосов
/ 23 ноября 2008

Остерегайтесь в любое время, когда вы видите следующую строку:

On Error Resume Next

Это было бы моей осторожностью при использовании классического ASP.

4 голосов
/ 23 ноября 2008

Условные обозначения иногда не интуитивны.

Например, при работе с Null s: хотя True и Null не равны, следующее выражение будет действовать как False. В этом случае хорошо бы проверить Null явно, используя IsNull.

valueIsTrue = True
valueIsNull = Null
If valueIsTrue <> valueIsNull Then ...

Кроме того, в отличие от некоторых других языков, все части условия оцениваются, даже если первая часть - False. Например, следующий пример вернет ошибку, если myObject были Nothing:

If Not IsNothing(myObject) And myObject.IsValid() Then ...

Решение состоит в том, чтобы отделить условия, используя вложенные If s или другие средства:

If Not IsNothing(myObject) Then
    If myObject.IsValid() Then
        ...
3 голосов
/ 26 января 2009

VBScript имеет простой способ позволить вам вызывать подпрограммы с круглыми скобками, если у вас есть только 1 параметр. Однако, если этот параметр передается по ссылке, возвращаемое значение не появляется, если вы используете круглые скобки:

<% OPTION EXPLICIT %>
<%

sub MakeLonger(byref something)
    something = "hello " & something 
end sub

dim msg
msg = "World"

MakeLonger(msg)
response.write msg
response.write "<br />"

MakeLonger msg
response.write msg

%>

Вывод:

World 
hello World
3 голосов
/ 14 ноября 2008

Распространенная ошибка при использовании форм HTML - это несоответствие между CharSet страницы формы и CodePage принимающей страницы.

Типичным примером является случай, когда страница формы устанавливает свой CodePage на 65001, а ответ CharSet на UTF-8. Это приводит к тому, что любые значения, введенные в форму, отправляются обратно с использованием кодировки UTF-8. Получающая страница оставляет свой CodePage с установленной кодовой страницей OEM-системы, например 1252.

Счетчик интуитивно ASP использует Response.CodePage, чтобы определить, как следует интерпретировать символы в посте формы, поэтому кодировка UTF-8 ошибочно принимается как набор из 1252 символов, портящих ввод.

Иногда это остается незамеченным, потому что страница отвечает устанавливает Reponse.CharSet в UTF-8, но оставляет его CodePage без изменений. Результат для пользователя выглядит хорошим, но данные, введенные в базу данных, повреждены.

Моя рекомендация: Сохранить как UTF-8, использовать @codepage = 65001 на всех страницах и всегда устанавливать Response.CharSet в UTF-8. Это охватывает все.

2 голосов
/ 13 ноября 2008

Убедитесь, что вы используете Set для ссылок на объекты:

 Dim rs : Set rs = CreateObject("ADODB.Recordset");

Если вы этого не сделаете, то получите либо недопустимую ссылку на переменную, либо свойство по умолчанию

 Dim field      : Set field  = rs(0)
 Dim fieldValue : fieldValue = rs(0) 'Same as field.Value
1 голос
/ 13 ноября 2008

Вы можете оставить скобки при передаче аргументов функциям, но только если вызов функции является единственным выражением в операторе:

 DoSomething withThisArgument
 Dim result : result = DoSomething(withThisArgument)
 result = DoSomething withThisArgument 'SYNTAX ERROR
0 голосов
/ 27 января 2009

классический ASP имеет много ошибок, если вы никогда не работали с ним :) я бы порекомендовал взглянуть на ajaxed library , которая до сих пор поддерживается классической библиотекой asp. Это поможет вам избавиться от наиболее распространенных ошибок при работе с устаревшими приложениями.

0 голосов
/ 13 ноября 2008

Автоматическое распределение переменных, вероятно, одна из самых больших ошибок.

Dim varA, varB

varA = varA + varV

Oops! Что varV спросите вы? Ну ... я просто набрал B для V, и все по-прежнему работает отлично ... это должно быть хорошо!

За исключением того, почему varB не добавляется в varA ?? Это должно быть ошибка Microsoft!

...