在許多時候我們使用ASP+數(shù)據(jù)庫進行網站編程的時候,會遇上讀取某記錄出來和另外一些變量進行運算的情況,如果取的記錄數(shù)據(jù)為NULL值,那么可能會造成程序返回錯誤結果,如果每個讀記錄的語句后都加上判斷語句,程序又顯得拖沓,因此,我認為編寫一個專用的函數(shù)對讀取的記錄進行自動或半自動識別是很好的辦法。 根據(jù)VBscript的數(shù)據(jù)類型定義,結合利用VarType函數(shù),構造以下自動處理函數(shù)InitdataType, 輸入兩個參數(shù),要處理數(shù)據(jù)本身(theDate)和準備輸出的數(shù)據(jù)類型(theReturnType,整數(shù)型): theReturnType強制返回的數(shù)據(jù)類型 ,同VarType返回值定義的意義一樣, 'theReturnType 如果忽略: 返回同theDate一樣的數(shù)據(jù)類型. 比較常見的NULL返回,對于字符串型返回空字符串,對各種于數(shù)值返回0值,對于邏輯值返回FALSE(假),對于日期 返回最早的日期 函數(shù)程序: Function InitdataType(theDate,theReturnType) '返回或強制指示變量子類型的值。theDate 參數(shù)可以是任何變量。 'theReturnType(整數(shù)型): 強制返回的數(shù)據(jù)類型 ,同VarType返回值定義的意義一樣 'theReturnType 如果忽略: 返回同theDate一樣的數(shù)據(jù)類型. '下面引用的函數(shù)VarType(varname)會返回指示變量子類型的值。,varname 參數(shù)可以是任何變量。 'VarType函數(shù)返回值的意義如下: 'vbEmpty 0 Empty(未初始化) 'vbNull 1 Null(無有效數(shù)據(jù)) 'vbInteger 2 整數(shù) 'vbLong 3 長整數(shù) 'vbSingle 4 單精度浮點數(shù) 'vbDouble 5 雙精度浮點數(shù) 'vbCurrency 6 貨幣 'vbDate 7 日期 'vbString 8 字符串 'vbObject 9 Automation 對象 'vbError 10 錯誤 'vbBoolean 11 Boolean 'vbVariant 12 Variant(只和變量數(shù)組一起使用) 'vbDataObject 13 數(shù)據(jù)訪問對象 'vb???? 14 小數(shù) 'vbByte 17 字節(jié) 'vbArray 8192 數(shù)組 On Error Resume Next 'Err.Clear dim n_dataType,vo_ReData,vo_renewdata,c_TypeName n_dataType = VarType(theDate) 'c_TypeName = TypeName(theDate) If n_dataType<2 then if isNumeric(theReturnType) then Select Case theReturnType case 1 vo_renewdata=NULL case 2 vo_renewdata=0 case 3 vo_renewdata=0 case 4 vo_renewdata=0 case 5 vo_renewdata=0 case 6 vo_renewdata=0 case 7 vo_renewdata=0 case 8 vo_renewdata="" case 11 vo_renewdata=DEF_False case 14 vo_renewdata=0 case 17 vo_renewdata=chr(0) case else vo_renewdata=theDate end Select else vo_renewdata=theDate end if else if isNumeric(theReturnType) then Select Case theReturnType case 0 vo_renewdata=Empty case 1 vo_renewdata=NULL case 2 if isNumeric(theDate) then vo_renewdata=cInt(theDate) else vo_renewdata=Eval("0+" & theDate &"") if not isNumeric(vo_renewdata) then vo_renewdata=0 end if case 3 if isNumeric(theDate) then vo_renewdata=cLng(theDate) else vo_renewdata=Eval("0+" & theDate &"") if not isNumeric(vo_renewdata) then vo_renewdata=0 end if case 4 if isNumeric(theDate) then vo_renewdata=cSng(theDate) else vo_renewdata=Eval("0+" & theDate &"") if not isNumeric(vo_renewdata) then vo_renewdata=0 end if case 5 if isNumeric(theDate) then vo_renewdata=cDbl(theDate) else vo_renewdata=Eval("0+" & theDate &"") if not isNumeric(vo_renewdata) then vo_renewdata=0 end if case 6 if isNumeric(theDate) then vo_renewdata=cCur(theDate) else vo_renewdata=0 end if case 7 if isDate(theDate) then vo_renewdata=theDate else vo_renewdata=cDate(0) end if case 8 if Not isNull(theDate) then vo_renewdata=cStr(theDate) else vo_renewdata="" end if case 11 If (not isNull(theDate)) or theDate<>"" Then vo_renewdata=DEF_True else vo_renewdata=DEF_False end if case 14 if isNumeric(theDate) then vo_renewdata=cDbl(theDate) else vo_renewdata=Eval("0+" & theDate &"") if not isNumeric(vo_renewdata) then vo_renewdata=0 end if case 17 if Not isNull(theDate) then vo_renewdata=CByte(theDate) else vo_renewdata=CByte(0) end if case else vo_renewdata=theDate end Select else vo_renewdata=theDate end if end if err.clear 'vMsgBox("rtn:" & cstr(vo_renewdata) & " type:" & cstr(c_TypeName)) & "/" & cstr(n_dataType) InitdataType=vo_renewdata End Function
在實際程序中調用示意: Set conn = Server.CreateObject("ADODB.Connection") conn.open xDb_Conn_Str Set rs=Server.Createobject("ADODB.Recordset") dim n_OD,cNewName ,nNewValue n_OD=1.2 sql = "SELECT sl_Name,sl_Value FROM Table_SL WHERE sl_name='mike'" rs.open sql,conn,1 if not rs.eof then cNewName = InitdataType(rs("sl_Name"),8) nNewValue = InitdataType(rs("sl_Value"),5) * n_OD response.write cNewName & "的標準零售價為:" & nNewValue & "(元)" end if rs.Close Set rs=Nothing
|