9

Classic ASP/VBScript で記述された Web アプリケーションをサポート/強化しています。どちらも日常的に使用してから約10年になります。「落とし穴」と見なす問題に出くわしたばかりで、他の人にも同様のことを知っておく必要があるかどうか疑問に思っていました。

私の問題:
SQL テーブルの列を float から decimal に変換する必要がありました。decimal は、vbscript で実際にサポートされている (または適切にサポートされている) 型ではないことがわかりました。したがって、次のコード:

Dim var1, var2

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

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

次の行で Type Mismatch エラーが発生します。

If (var1 <> var2) Then

よく調べた結果、次のことがわかりました。

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

問題を解決します。しかし、それは明白なことのようには思えず、その行で Type Mismatch が発生した理由を理解するのにしばらく時間がかかりました.

皆さんへの私の質問は、このような他の小さな癖に出くわしたことがありますか? ASP/vbscript で気をつけなければならない「落とし穴」と思われるものは何ですか?

4

9 に答える 9

10

私の後に繰り返してください:すべての優れたVBプログラマーが使用しますOption Explicit

これにより、誤って新しい変数を宣言して使用することを防ぐことができます。

それを超えて、それはあなたが何をしているかに依存します。

于 2008-11-21T22:45:00.923 に答える
8

次の行が表示されるときはいつでも注意してください。

On Error Resume Next

これは、従来の ASP を使用する際の注意事項です。

于 2008-11-23T05:25:31.443 に答える
4

条件分岐は、少し直感的でない場合があります。

たとえば、Nulls を扱う場合:TrueNullは等しくありませんが、次の式は のように動作し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
        ...
于 2008-11-23T04:13:14.130 に答える
3

HTMLフォームを使用する場合の一般的な落とし穴は、フォームページのCharSetと受信ページのCodePageの不一致です。

典型的な例は、フォームページがそのCodePageを65001に設定し、応答CharSetをUTF-8に設定する場合です。これにより、フォームに入力された値はすべて、UTF-8エンコーディングを使用してポストバックされます。受信ページは、そのCodePageセットを1252などのシステムOEMコードページに残します。

直感に反して、ASPはResponse.CodePageを使用して、フォームpostの文字をどのように解釈するかを決定します。したがって、UTF-8エンコーディングは、入力を破損する1252文字のセットとして誤って受け入れられます。

ページが応答してReponse.CharSetをUTF-8に設定し、CodePageを変更しないため、これが検出されない場合があります。ユーザーには良い結果が表示されますが、データベースに入力されたデータは破損しています。

私の推奨事項は、UTF-8として保存し、すべてのページで@codepage = 65001を使用し、常にResponse.CharSetをUTF-8に設定することです。これはすべてをカバーします。

于 2008-11-14T06:18:30.730 に答える
3

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
于 2009-01-26T20:14:47.593 に答える
2

Setオブジェクト参照には必ず次を使用してください。

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

そうしないと、無効な変数参照またはデフォルト プロパティが取得されます。

 Dim field      : Set field  = rs(0)
 Dim fieldValue : fieldValue = rs(0) 'Same as field.Value
于 2008-11-13T16:34:06.433 に答える
1

関数に引数を渡すときに括弧を省略できますが、関数呼び出しがステートメント内の唯一の式である場合に限ります。

 DoSomething withThisArgument
 Dim result : result = DoSomething(withThisArgument)
 result = DoSomething withThisArgument 'SYNTAX ERROR
于 2008-11-13T16:37:27.847 に答える
0

古典的なASPには、一度も使用したことがない場合、多くの落とし穴があります:)まだ維持されている古典的なASPライブラリであるajaxedライブラリを確認することをお勧めします。これにより、レガシー アプリを扱う際の最も一般的な落とし穴を取り除くことができます。

于 2009-01-27T03:43:15.210 に答える
0

自動変数割り当ては、おそらく最大の問題の 1 つです。

Dim varA, varB

varA = varA + varV

おっとっと!あなたは何varVを尋ねますか?ええと.. B を V と間違えただけで、すべてが完全に機能します.. それは良いことです!

varB が varA に追加されない理由を除いて?? それは Microsoft のバグに違いありません。

于 2008-11-13T16:37:55.707 に答える