<%
Function AAA(str)
For i = 0 To 3
If i = 1 Then Exit For
Next
AAA = str
End Function
For i = 0 To 5
r = AAA("A")
Response.Write(r)
Next
%>
这里 AAA 函数中有一个 i 变量会被认为和下面的 i 是同一个变量,这样就进入死循环了。
所以要注间函数中的变量一定要定义为局部变量。
如
<%
Function AAA(str)
Dim i
For i = 0 To 3
If i = 1 Then Exit For
Next
AAA = str
End Function
%>
'YYYY-MM-DD、YY-M-D、YYYY/MM/DD、YY/M/D
Function DateTimeFormat(dateTime, format)
Select Case format
Case "YYYY-MM-DD"
DateTimeFormat = Year(dateTime) & "-" & Right("0" & Month(dateTime), 2) & "-" & Right("0" & Day(dateTime), 2)
Case "YY-M-D"
DateTimeFormat = Right(Year(dateTime), 2) & "-" & Month(dateTime) & "-" & Day(dateTime)
Case "YYYY/MM/DD"
DateTimeFormat = Year(dateTime) & "/" & Right("0" & Month(dateTime), 2) & "/" & Right("0" & Day(dateTime), 2)
Case "YY/M/D"
DateTimeFormat = Right(Year(dateTime), 2) & "/" & Month(dateTime) & "/" & Day(dateTime)
Case Else
DateTimeFormat = dateTime
End Select
End Function
有一个系统自带的函数 FormatDateTime(Now, 1),第二个参数可以指定样式,但种类不多,写一个自定义的DateTimeFormat 比较好用些。
'返回第一行,第一列的值
Function ExecuteScalar(sql)
Dim rs1
rs1 = Server.CreateObject("Adodb.Recordset")
rs1.Open sql,conn,1,1
If rs1.Bof And rs1.Eof Then
ExecuteScalar = ""
Else
ExecuteScalar = rs1(0)
End If
rs1.Close
Set rs1 = Nothing
End Function
'返回数组,将第一行的数据放入数组中,UBound 函数获取数组长度
Function ExecuteOneArray(sql)
Dim arr()
Set rs = Server.CreateObject("Adodb.Recordset")
rs.Open sql,conn,1,1
If rs.Bof And rs.Eof Then
ReDim Preserve arr(0)
arr(0) = ""
Else
For i=0 To rs.Fields.Count - 1
ReDim Preserve arr(i) '将数组长度变长
arr(i) = rs(i)
Next
End If
ExecuteOneArray = arr
rs.Close
Set rs = Nothing
End Function
'接收参数,返回整型
Function RequestInt(name)
On Error Resume Next
iD = Cint(Request(name))
If Err.Number = 0 Then
RequestInt = iD
Else
RequestInt = 0
End If
End Function
'返回指定长度的字符串,长度按字节算
Function GetTopic(str, strlen)
Dim l,t,c,i
l = len(str)
t = 0
For i = 1 To l
c = Abs(Asc(Mid(str, i, 1)))
If c > 255 Then ' 汉字占两个位置
t = t + 2
Else
t = t + 1
End If
If t >= strlen Then
GetTopic = left(str, i)
Exit For
Else
GetTopic = str
End If
Next
End Function
比如要发送一个Http请求,获取指定页面的内容
Response.Write(GetHttpPage("http://www.baidu.com/","GB2312"))
Function GetHttpPage(url, charset)
Dim http
Set http = Server.createobject("Msxml2.ServerXMLHTTP")
http.Open "GET", url, false
http.Send()
If http.readystate<>4 Then
Exit Function
End If
GetHttpPage = BytesToStr(http.ResponseBody, charset)
Set http = Nothing
End function
Function BytesToStr(body, charset)
Dim objStream
Set objStream = Server.CreateObject("Adodb.Stream")
objStream.Type = 1
objStream.Mode = 3
objStream.Open
objStream.Write body
objStream.Position = 0
objStream.Type = 2
objStream.Charset = charset
BytesToStr = objStream.ReadText
objStream.Close
Set objStream = Nothing
End Function
在ASP,没有 try catch,而是用 On Error Resume Next 代替
如比创建一个对象
try
{
Set obj = Server.CreateObject("JMail.SmtpMail")
}
catch
{
Response.Write("Err")
}
上面的代码是 ASP 中的写法是
On Error Resume Next
Set obj = Server.CreateObject("JMail.SmtpMail")
If Err.Number = 0 Then
Response.Write("Yes")
Else
Response.Write("Err")
End If
rs.open Source, ActiveConnection, CursorType, LockType, Options
一共有五个参数
Source: SQL语句或存储过程等
ActiveConnection: 数据库连接对象
CursorType: 记录集的游标类型
LockType: 记录集的锁定类型
Options: 指示如何计算 Source 参数
CursorType 如下四个值:
AdOpenForwardOnly (0) (默认值)打开仅向前类型游标。 rs.MovePrevious 不起作用。
AdOpenKeyset (1) 打开键集类型游标。可自由移动。
AdOpenDynamic (2) 打开动态类型游标。可自由移动。
AdOpenStatic (3) 打开静态类型游标。可自由移动。
AdOpenKeyset 键集类型游标
如果同时有其他用户修改或删除了记录集中的一条记录, 记录集将反映这个变化,但是, 如果其他用户添加了一条新记录, 新记录不会出现在记录集中。
AdOpenDynamic 动态类型游标
其他用户造成的记录的任何变化都将在记录集中有所反映。
AdOpenStatic 静态类型游标
只是数据的一个快照,用户对记录所做的修改,增加或删除都不会反映到记录集中。
LockType 如下四个值:
AdLockReadOnly (1)(默认值)只读。不能改变数据。
AdLockPessimistic (3) 悲观锁定。 编辑一开始,则立即锁住记录。
AdLockOptimistic (3) 乐观锁定。 用 Update 方法提交更新记录时才锁定记录。
AdLockBatchOptimistic (4) 批量乐观锁定。允许修改多个记录,只有调用 UpdateBatch 方法后才锁定记录。
Options 如下:
adCmdText: 将 Source 作为命令的文本定义来计算。
adCmdStoredProc: 将 Source 视为存储过程。
这个参数不常用。
常用的有
rs.Open sql, conn, 1, 1
键集类型游标,只读
记录集可自由移动,但不能修改。
rs.Open sql, conn, 1, 3
键集类型游标,乐观锁定
记录集可自由移动,可以修改,只在 Update 只锁定当前记录。
记录集对象的方法:
rs.MoveNext 将记录指针从当前的位置向下移一行
rs.MovePrevious 将记录指针从当前的位置向上移一行
rs.MoveFirst 将记录指针移到数据表第一行
rs.MoveLast 将记录指针移到数据表最后一行
rs.AbsolutePosition = N 将记录指针移到数据表第N行
rs.AbsolutePage = N 将记录指针移到第N页的第一行
rs.PageSize = N 设置每页为N条记录
rs.PageCount 根据 pagesize 的设置返回总页数
rs.RecordCount 返回记录总数
rs.Bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.Eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.Delete 删除当前记录,但记录指针不会向下移动
rs.AddNew 添加记录到数据表末端
rs.Update 更新数据表记录
'连接ACCESS数据库
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ABC.mdb"
'连接MSSQL数据库
connStr = "Driver={SQL Server};Server=127.0.0.1;uid=sa;pwd=;database=ABC"
<%
On Error Resume Next
Dim connStr
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("ABC.mdb")
Set conn = Server.CreateObject("Adodb.Connection")
conn.Open connStr
conn.Close
Set conn = Nothing
If Err Then
err.Clear
Set conn = Nothing
Response.Write("数据库连接出错。")
Response.End
End If
%>