2008-11-13 3 views
9

저는 Classic ASP/VBScript로 작성된 웹 응용 프로그램을 지원/향상하고 있습니다. 하루 중 어느 때라도 나를 사용했기 때문에 약 10 년이되었습니다. 나는 단지 "잡았다"라고 생각하고 내가 알고 있어야하는 것을 배워야하는 비슷한 것들을 다른 사람들이 가지고 있는지 궁금해했다.ASP/VBScript "Gotchas"

내 문제 :
SQL 테이블의 열을 10 진수로 변환해야했습니다. decimal은 vbscript에서 실제로 지원되거나 잘 지원되는 유형이 아닙니다. 그래서 다음 코드를

Dim var1, var2 

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

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

이 라인에 형식 불일치 오류로 날려겠습니까 :

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

문제가 해결 : 나는 것을 발견

If (var1 <> var2) Then 

많이 검색 한 후. 그러나 그것은 명백한 것으로 보이지 않았고 왜 그 라인에서 타입 불일치를 얻었는지 알아내는 데 시간이 걸렸습니다.

제 질문은 모두에게있어서, 다른 작은 단점이 있습니까? ASP/VBScript 내에서 내가주의해야 할 "잡았다"라고 생각할 수있는 것은 무엇입니까?

답변

2

확인 당신이 사용하고 있는지 객체 참조에 대한 Set :

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

당신은하지 당신도거야 잘못된 변수 참조하거나 기본 속성을 취득 할 경우

Dim field  : Set field = rs(0) 
Dim fieldValue : fieldValue = rs(0) 'Same as field.Value 
1

함수 호출이 명령문의 유일한 표현식 인 경우에만 인수를 함수에 전달할 때 괄호를 생략 할 수 있습니다.

DoSomething withThisArgument 
Dim result : result = DoSomething(withThisArgument) 
result = DoSomething withThisArgument 'SYNTAX ERROR 
+0

불확실한 괄호가없는 명령문을 읽고 쓰는 것이 더 쉽습니다. –

+0

표현식이라는 용어를 잘못 사용하면 문장이 표현식이 아닙니다. 표현식에서 함수를 사용할 때는 항상 괄호가 필요합니다. 나는 누구도이 실수를 시도한 적이 없으며 구문 오류로 받아 들여지지 않기 때문에 'Gotcha'가된다. – AnthonyWJones

+0

오랫동안 살아 계신 것은 아니지만 VBScript 저자 (대부분 새로운 사람)를 여행하는 공통점이있다. 저는 진술이 표현이라고 말하지 않았습니다. 그러나 명령문에는 일반적으로 표현식이 포함됩니다. "DoSomething arg"의 경우에는 하나의 기능 호출 식으로 구성된 명령문입니다. –

0

자동 변수 할당은 아마도 가장 큰 문제 중 하나입니다.

Dim varA, varB 

varA = varA + varV 

varV는 무엇입니까? 음 .. 나는 단지 V를 잘못 입력했는데 모든 것이 여전히 완벽하게 작동합니다. 그것은 좋은 것임에 틀림 없습니다!

왜 varB가 varA에 추가되는 것을 제외하고는 ?? 그건 마이크로 소프트의 버그 야!

+1

대부분의 동적 언어에서 마찬가지입니다. 당신은 항상 "Option Explicit"을 사용해야합니다. –

3

HTML 양식을 사용할 때 일반적인 Gotcha는 양식 페이지의 CharSet와 수신 페이지의 CodePage가 일치하지 않습니다.

전형적인 예는 FormPage가 CodePage를 65001로 설정하고 응답 CharSet을 UTF-8로 설정하는 경우입니다. 이로 인해 양식에 입력 된 모든 값이 UTF-8 인코딩을 사용하여 다시 게시됩니다. 수신 페이지는 해당 CodePage가 System OEM 코드 페이지를 1252와 같이 설정합니다.

Counter는 직관적으로 Response.CodePage를 사용하여 양식 게시물의 문자를 해석해야하는 방식을 결정하므로 UTF-8 인코딩은 입력을 손상시키는 1252자를 설정하십시오.

페이지가 응답하여 응답하지 않기 때문에 가끔은 감지되지 않습니다.CharSet는 UTF-8로 설정되지만 코드 페이지는 변경되지 않습니다. 사용자에게 결과가 좋지만 데이터베이스에 입력 된 데이터가 손상되었습니다.

내 권장 사항은 모든 페이지에서 @codepage = 65001을 사용하고 UTF-8로 Response.CharSet을 항상 설정하는 것입니다. 이것은 모든 것을 다룹니다. 나 후

10

반복 - 따라서 당신이하고있는 어떤 오프 던지는 모든 좋은 VB 프로그래머 그것은 실수로 새 변수를 선언하고 사용하는 것을 방해합니다

Option Explicit를 사용합니다.

그 외에도, 그것은 당신이하고있는 일에 달려 있습니다.

4

조건은 때때로 비현실적입니다.

예를 들어, Null을 처리 할 때 : TrueNull이 같지 않더라도 다음 표현식은 False처럼 동작합니다. 이 경우 IsNull을 사용하여 Null을 명시 적으로 확인하는 것이 좋습니다.

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

또한, 다른 언어와는 달리, 조건의 모든 부분은 첫 번째 부분은 False 경우에도 평가됩니다. myObjectNothing라면 예를 들어, 다음 예는 오류를 반환 :이 솔루션은 중첩 된 If의 또는 다른 수단을 사용하여 조건을 분리하는 것입니다

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

:

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

당신이 볼 언제나 조심을 다음 줄 :

On Error Resume Next 

기존 ASP 사용시주의해야합니다.

+0

이 프로그래머들이 모든 예외 사항을 조용히 먹는 것으로 옮겼습니다. – SqlACID

+0

물론, 오류를 표시하지 않으려는 빈 catch 블록과 같은 것은 없습니다. ;) –

3

VBScript에는 매개 변수가 하나 뿐인 경우 괄호로 subs를 호출 할 수있는 방법이 있습니다.

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

고전적인 ASP는 개는 많이 가지고 그 paramater 참조에 의해 전달되는 경우 괄호를 사용하는 경우, 반환 값은 출력되지 않습니다 그것과 함께 :) 나는 아직도 유지 클래식 ASP 라이브러리입니다 ajaxed library 좀보고하는 것이 좋습니다 것입니다. 레거시 응용 프로그램을 다룰 때 가장 일반적으로 발생하는 문제를 제거하는 데 도움이됩니다.

관련 문제