2008-11-13 11 views
9

मैं क्लासिक एएसपी/वीबीस्क्रिप्ट में लिखे गए वेब एप्लिकेशन का समर्थन/बढ़ा रहा हूं। यह लगभग 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) 

समस्या का समाधान। लेकिन यह एक स्पष्ट बात की तरह प्रतीत नहीं हुआ और मुझे यह पता लगाने में थोड़ी देर लग गई कि मुझे उस रेखा पर टाइप मिस्चैच क्यों मिल रहा था।

तो हर किसी के लिए मेरे सवाल है, क्या अन्य छोटे quirks इस तरह आप के पार चला है? एएसपी/वीब्स्क्रिप्ट के भीतर कुछ चीजें क्या हैं जिन्हें आप "गेटचास" के रूप में सोचेंगे जो मुझे देखने के लिए होना चाहिए?

उत्तर

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

शब्द अभिव्यक्ति का आपका उपयोग भ्रामक है, एक कथन एक अभिव्यक्ति नहीं है। अभिव्यक्ति कोष्ठक में फ़ंक्शन का उपयोग करते समय हमेशा आवश्यक होता है। मैंने कभी भी इस गलती का प्रयास नहीं किया है और चूंकि इसे सिंटैक्स त्रुटि के रूप में उठाया जाता है, इसलिए यह शायद ही कभी 'गोटा' – AnthonyWJones

+0

है, यह लंबे समय तक रहने वाला गॉचा नहीं है, लेकिन यह एक आम बात है जो वीबीस्क्रिप्ट लेखकों (ज्यादातर नए) यात्रा करता है। मैंने यह नहीं कहा कि एक बयान एक अभिव्यक्ति थी। एक बयान में आमतौर पर अभिव्यक्तियां होती हैं, हालांकि। "DoSomething arg" के मामले में यह एक कथन है जिसमें एक कार्यात्मक-कॉल-अभिव्यक्ति शामिल है। –

0

स्वत: चर आवंटन शायद सबसे बड़ी gotchas से एक है।

Dim varA, varB 

varA = varA + varV 

ओह! varV क्या है आप पूछते हैं? खैर .. मैंने बस वी के लिए बी को गलत टाइप किया और सबकुछ अभी भी पूरी तरह से काम करता है .. यह एक अच्छी बात होनी चाहिए!

क्यों Vara में जुड़ जाता है varB नहीं है सिवाय

?? यह माइक्रोसॉफ्ट की बग होना चाहिए!

+1

यह सबसे गतिशील भाषाओं के लिए सच है। आपको हमेशा "विकल्प स्पष्ट" –

3

एक आम पकड़ लिया जब HTML रूपों का उपयोग कर प्रपत्र पेज के अक्षरसेट और प्राप्त पेज के कोड पृष्ठ पर के बीच एक बेमेल है।

एक विशिष्ट उदाहरण है जहां फार्म पेज 65001 करने के लिए अपने कोड पृष्ठ पर और UTF-8 के जवाब CharSet सेट करता है। इससे यूटीएफ -8 एन्कोडिंग का उपयोग करके पोस्ट किए जाने वाले किसी भी मान को फॉर्म में दर्ज किया जाता है। प्राप्तकर्ता पृष्ठ अपने कोडपेज को सिस्टम OEM कोड पृष्ठ को 1252 सेट करता है।

काउंटर सहजता से एएसपी प्रतिक्रिया पोस्ट का उपयोग करता है यह निर्धारित करने के लिए कि फ़ॉर्म पोस्ट में वर्णों का अर्थ कैसे लिया जाना चाहिए, इसलिए यूटीएफ -8 एन्कोडिंग को गलती से स्वीकार किया जाता है इनपुट में भ्रष्ट 1252 वर्ण सेट करें।

कभी कभी यह चल पाता चला जाता है, क्योंकि वह पृष्ठ सेट यह प्रतिक्रिया प्रतिक्रिया करता है।चार्टसेट यूटीएफ -8 पर है लेकिन इसके कोडपेज को अपरिवर्तित छोड़ देता है। उपयोगकर्ता का परिणाम अच्छा दिखाई देता है लेकिन डेटाबेस में दर्ज डेटा दूषित है।

मेरी सिफारिश यूटीएफ -8 के रूप में सहेजें, सभी पृष्ठों में @codepage = 65001 का उपयोग करें और हमेशा Response.CharSet को UTF-8 पर सेट करें। इसमें सबकुछ शामिल है। मेरे बाद

10

दोहराएँ: सभी अच्छे वीबी प्रोग्रामर Option Explicit

का उपयोग यह गलती से एक नया वेरिएबल घोषित करने और इसे का उपयोग करने से रखेंगे - इस प्रकार दूर फेंक आप जो कुछ भी कर रहे हैं।

इसके अलावा, यह आपके द्वारा किए जा रहे कार्यों पर निर्भर करता है।

4

कभी-कभी कंडीशनल थोड़ा अनजान होते हैं।

उदाहरण के लिए, जब Null रों के साथ काम: हालांकि True और Null बराबर नहीं हैं, निम्नलिखित अभिव्यक्ति False की तरह कार्य करेगा। इस मामले में स्पष्ट रूप से IsNull का उपयोग करके जांचना अच्छा होता है।

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

इसके अलावा, कुछ अन्य भाषाओं के विपरीत, एक शर्त के सभी भागों का मूल्यांकन किया जाता है, भले ही पहले भाग False है। उदाहरण के लिए, निम्न उदाहरण एक त्रुटि वापसी होगी अगर myObjectNothing थे:

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

समाधान नेस्टेड If या कुछ अन्य साधनों का उपयोग कर स्थिति को अलग करने के लिए है:

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

कभी भी खबरदार आप देख निम्नलिखित पंक्ति:

On Error Resume Next 

क्लासिक एएसपी का उपयोग करने में मेरी सावधानी बरतनी होगी।

+0

का उपयोग करना चाहिए, इसमें कोई संदेह नहीं है कि इन प्रोग्रामर चुपचाप सभी अपवादों को खाने के लिए आगे बढ़े हैं। – SqlACID

+0

बेशक, त्रुटियों को दिखाने से रोकने के लिए उन खाली पकड़ ब्लॉक की तरह कुछ भी नहीं है। ;) –

3

वीबीस्क्रिप्ट में आपको केवल 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 
0

क्लासिक एएसपी gotchas की एक बहुत कुछ है, तो यू काम नहीं इसके साथ :) मैं ajaxed library पर एक नज़र रखने की अनुशंसा करता हूं जो अभी भी एक क्लासिक एएसपी लाइब्रेरी है। विरासत ऐप्स से निपटने के दौरान यह आपको सबसे आम गठिया से छुटकारा पाने में मदद करता है।