• 4784阅读
  • 0回复

{{转}}关于数据处理的一个类[supfrie] [复制链接]

上一主题 下一主题
离线XChinux
 

只看楼主 倒序阅读 楼主  发表于: 2005-07-30
每次在数据提交入库的时候总是要写一大堆的判断,检查函数,来检测数据的合法性,这连天没事就先整理了一下,写了个简单的数据处理的类。

用法:按找一定顺序检查所有变量,如果这个变量不满足检查条件,就把错误消息收集入栈,当所有变量都检查完毕以后再按照相反的顺序来处理变量,处理一个就弹出一个错误消息,然后在最后进行整体检查,如果还有错误的话,就说明客户数据有问题。此时就弹出错误信息,提示客户,并可以根据不同的设置(返回上一页,关闭窗口,重新定向)来继续处理

<%
'*******************************************************************************************
'* 程序:DataFilter.asp
'*
'* 描述:处理数据的类
'*
'* 作者:田野
'*
'* Email:Foxty@sina.com
'*
'* 日期:
'*
'* 程序说明:
'* 1,域说明:
'* MAXINT 整型数据上界
'* MININT 整型数据下界
'* ErrCount 已经发现的错误个数,初值为0
'* ErrInfo 错误信息串,不同的信息用‘|’分隔开来
'* ErrPoolSize 错误信息池的容量
'* IncSize 当信息池不够时续分配IncSize个空间
'* ErrCount 显示当前系统错误的个数
'* ErrInfo() 存放错误信息的数组
'* Pos 当前错误信息的指针, 指向最后一个错误信息的下一个空间
'* IllegalChar 非法字符集合
'* FilterChar 替换字符集合,对应非法字符集合
'* Submited 标志变量,标志是否进行了整体检查
'*
'* 2,方法说明:
'*
'* Bool CheckInt( IntData , TypeId , ErrMsg) IntData为需要检查的源数据,Type 为范围类型(1-整数 2-正整数(包含0) 3-负整数(包含0) 4-自然数 5-负整数)
'*
'* Bool CheckStr( StrData , StrMinLen , StrMaxLen , ErrMsg ) StrData是需要检查的数据源,检查是否包
'* 含非法字符,StrMinLen为需要限制的最小长度,0表示无限制,StrMaxLen 为需要限制的最大长度,0表示无限制
'*
'* String Filtrate( StrData ) 过滤非法字符
'*
'* String ReplaceChar( StrData ) 替换非法字符
'*
'* Void Submit( ) 提交错误检查,如果发现处理后任存在错误,则将收集的错误信息返回给客户
'*
'* Void PopMsg( StrMod ) JS弹出提示信息,StrMod表示状态,"Last"表示回上一页,"Close"表示关闭窗口,其他StrMod就表示URL,有错误就跳转至URL地址
'*
'* Bool RegChk( Pattern , Str ) 利用正则表达式来检测,Pattern 为格式串,Str为源字符串
'*
'* Void PutErrMsg( ErrMsg ) 收集错误信息
'*
'* Void Alloc( IncSize ) 为错误信息池加配空间
'*
'* Void PopErrMsg( ErrMsg ) 释放错误信息
'*
'*******************************************************************************************

'Option Explicit
'On Error Resume Next

Class DataFilter
'============常量定义===========
Private MAXINT '整数的上界
Private MININT '整数的下界

'============信息类变量定义=====
Private ErrPoolSize '错误信息池的大
Private IncSize '当信息池不够时分配IncSize个空间
Public ErrCount '显示当前系统错误的个数
Private ErrInfo() '存放错误信息的数组
Private Pos '当前错误信息的指针, 指向最后一个错误信息的下一个空间
Private IllegalChar '非法字符集合
Private FilterChar '替换字符集合,对应非法字符集合

'============标志类变量定义======
Private Submited '标志变量,检查是否已经提交所有数据检查结果

'类初始化
Sub Class_Initialize()
MAXINT = 32767
MININT = -32768

ErrPoolSize = 10
IncSize = 5
ErrCount = 0
Redim ErrInfo( 10 )
ErrInfo(0) = " 错误提示:\n\n"
Pos = 1

IllegalChar = Array( "'" , """" , ";" , "%" , "_" )
FilterChar = Array( "," , "“" , ";" , "‰" , "—" )

Submited = False
End Sub

'=======================================================
'整数检查函数,IntData为需要检查的参数,TypeId为类型说明
Function CheckInt( IntData , TypeId , ErrMsg )
Dim Result
Result = False

Select Case (TypeId)
Case 1
Result = RegChk( "^[\+\-]?\d+$" , IntData ) And ( IntData <= MAXINT ) And ( IntData >= MININT )
Case 2
Result = RegChk( "^\d+$" , IntData ) And ( IntData <= MAXINT ) And ( IntData >= 0 )
Case 3
Result = RegChk( "^\-?\d+$" , IntData ) And ( IntData <= 0 ) And ( IntData >= MININT )
Case 4
Result = RegChk( "^\+?\d+$" , IntData ) And ( IntData <= MAXINT ) And ( IntData >= 1 )
Case 5
Result = RegChk( "^\-\d+$" , IntData ) And ( IntData <= -1 ) And ( IntData >= MININT )
Case Else
Result = False
End Select
'如果检测到有错误,则将错误信息收集
If Not Result Then
ErrCount = ErrCount + 1
PutErrMsg( ErrMsg )
End If

CheckInt = Result
End Function

'====================================================
'检查字符串StrDate是否满足在[StrMinLen,StrMaxLen]区间
Function CheckStr( StrData , StrMinLen , StrMaxLen , ErrMsg )
Dim Result,i,j

If StrMinLen = 0 Then '最小长度无限制的情况
If StrMaxLen = 0 Then '如果无最大长度限制
Result = ( Not HaveIllegalChar( StrData ) )
Else
Result = ( Len( StrData ) <= StrMaxLen ) And ( Not HaveIllegalChar( StrData ) )
End If
Else
If StrMaxLen = 0 Then '如果无最大长度限制
Result = ( ( Len( StrData ) >= StrMinLen ) And ( Not HaveIllegalChar( StrData ) ) )
Else
Result = ( ( Len( StrData ) >= StrMinLen ) And ( Len( StrData ) <= StrMaxLen ) And ( Not HaveIllegalChar( StrData ) ) )
End If
End If

If Not Result Then '如果检查到错误,将错误记数器加一,并将错误信息收集
ErrCount = ErrCount + 1
PutErrMsg( ErrMsg )
End If

CheckStr = Result
End Function
'字符串StrData是否包含非法字符
Private Function HaveIllegalChar( StrData )
Dim i,Result
Result = False
For i = 0 To Ubound( IllegalChar )
Result = ( Instr( StrData , IllegalChar( i ) ) > 0 )
If Result Then Exit For
Next
HaveIllegalChar = Result
End Function

'=================================================
'利用正则表达式Pattern模式来检查字符串 Str 的合法性
Private Function RegChk( Pattern , Str )
Dim Reg
Set Reg = New RegExp
Reg.Pattern = Pattern
Reg.IgnoreCase = True
Reg.Global = True
RegChk = Reg.Test( Str )
End Function

'============================================
'过滤掉StrData中的非法字符,返回过滤后的字符串,
Function Filtrate( StrData )
Dim i
For i = 0 To Ubound( IllegalChar )
StrData = Replace( StrData , IllegalChar( i ) , "")
Next
ErrCount = ErrCount - 1
PopErrMsg()
Filtrate = StrData
End Function

'======================================
'将StrData中的非法字符替换成合法字符
Function ReplaceChar( StrData )
Dim i
For i = 0 To Ubound( IllegalChar )
StrData = Replace( StrData , IllegalChar( i ) , FilterChar( i ) )
Next
ErrCount = ErrCount - 1
PopErrMsg()
ReplaceChar = StrData
End Function

'============
'收集错误信息
Private Sub PutErrMsg( ErrMsg )
If Pos + 3 > ErrPoolSize Then Alloc() '如果指针大于信息池的Size,则续分配空间
ErrInfo( Pos ) = ErrMsg
Pos = Pos + 1
End Sub

'====================
'为错误信息池加配空间
Private Sub Alloc()
Redim Preserve ErrInfo( Cint( ErrPoolSize + IncSize ) )
ErrPoolSize = ErrPoolSize + IncSize
End Sub

'============
'弹出错误信息
Private Sub PopErrMsg( )
Pos = Pos - 1
ErrInfo( Pos ) = ""
End Sub

'=======================
'检查错误信息,如果有错误存在,则弹出提示窗口.并返回上一页
Sub Submit()
If Cint(ErrCount) > 0 Then
PopMsg( "close" )
Response.End()
End If
End Sub

Private Sub PopMsg( StrMod ) '弹出信息
Select Case ( Lcase( StrMod ) )
Case "last"
Response.Write( "<script language='javascript'>window.alert('"&Join(ErrInfo)&"');window.history.go(-1)</script>" )
Case "close"
Response.Write( "<script language='javascript'>window.alert('"&Join(ErrInfo)&"');window.close()</script>" )
Case Else
Response.Write( "<script language='javascript'>window.alert('"&Join(ErrInfo)&"');window.location.href('"&StrMod&"');</script>" )
End Select
End Sub

'======
'类注销
Sub Class_Terminate()
If Not Submited Then Submit()
Erase ErrInfo
End Sub
End Class

Set Tt = New DataFilter
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
tt.CheckInt "asdf",1," ·Number Error!Please Check It!\n\n"
Set Tt = Nothing
%>





由于时间仓促,肯定是功能比较欠缺,HOHO,还要忙着几个考试,郁闷ING,希望大家多给点意见,我来完善它,谢绝无建设性的文字,呵呵……
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
快速回复
限100 字节
 
上一个 下一个