如果您没有参加上周的测验,可以在这里试一下;您也可以继续阅读,让我们告诉您答案。不要忘了,本周我们又给出了一道新测验题。请试一试,看看您的答案会是什么。
那么,这个脚本的问题到底出在哪儿?实际上,这次找到脚本的问题所在应该相当容易:脚本不断回显第一条记录的值,一遍又一遍,没完没了。这里的问题与其说是“这个脚本的问题到底出在哪儿?”,不如说是:到底该怎么修复这个脚本?
看看我们能否找到解决办法。因为我们一次又一次不断回显第一条记录的值,您可能会以为应从要遍历整个记录集的 Do Until 循环开始排除故障。这是一个很不错的假设。让我们首先看一下代码本身:
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("FirstName") & " " & _
objRecordset.Fields.Item("LastName")
Loop
现在做一些非常不象脚本专家的事情,实际设想一下我们要在这里做什么。让我们暂时忽略代码本身,考虑一下此脚本应该会做什么。唔,我们使用了一个循环,它应当向我们显示记录 1 的值,接下来移动到下一条记录,然后再循环一次并显示记录 2 的值。这个过程应该持续到我们到达记录集的结尾,此时我们将自动跳出循环,继续执行脚本的其余部分。
没错;您真是非常敏锐。事实上,我们确实用粗体显示了移动到下一条记录。为什么?因为那是我们的脚本中缺少的元素。我们进入循环并回显了当前记录(正好是记录 1)的值。可是,我们忘了告诉脚本:“不错,让我们移动到下一条记录吧。”相反,我们只是再循环一次,然后又重新显示当前记录的值。不幸的是,当前记录仍然是记录 1。因此,脚本做了您告诉它做的,从而回显记录 1 的值。然后再循环一次,不知如何才好,第三次回显记录 1 的值。这个过程会永远继续下去,或者至少会持续到我们因为彻底厌烦了而终止脚本。(或者持续到脚本因彻底厌烦了而免了我们的职!)
事实证明,每次在 Do 循环中处理记录集中的记录都必须明确调用 MoveNext 方法,告诉脚本移动到下一条记录。否则,脚本就会陷在没完没了的循环中。我们的 Do Until 循环应如下所示:
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("FirstName") & " " & _
objRecordset.Fields.Item("LastName")
objRecordset.MoveNext
Loop
补全后的脚本应如下所示:
On Error Resume Next
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")
strPathtoTextFile = "C:\Scripts"
objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strPathtoTextFile & ";" & _
"Extended Properties=""text;HDR=YES;FMT=Delimited"""
objRecordset.Open "SELECT * FROM Employees.txt", _
objConnection, adOpenStatic, adLockOptimistic, adCmdText
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("FirstName") & " " & _
objRecordset.Fields.Item("LastName")
objRecordset.MoveNext
Loop
结果表明我们是只缺少一行代码。可是,不必说,它是相当重要的一行代码。
无可否认,确实没办法去知道 - 或者想到 - 除非您比较熟悉“ActiveX 数据库对象”(ADO)。但或许这就是要汲取的教训:开始使用某项技术之前,最好研读该技术。例如,有关使用数据库技术从文本文件检索信息的文章中并没有解释为什么需要使用 MoveNext;可是,该文章确实建议过那些不熟悉 ADO 的用户查阅网络广播系统管理员的数据库脚本。从以下屏幕快照中可以看到,MoveNext 是该网络广播中包括的一个主题:

查看网络广播可能会帮助您从一开始就避免此类问题。
我们的另外一点建议是,不要从头开始编写新脚本,而是从已有的脚本开始,对它进行修改以满足您的需要。虽然我们不能百分之百肯定,但我们的文章中包含了大多数脚本;也就是说,您可以复制相应脚本,将它粘贴到记事本中,然后开始一点点进行修改。使脚本按原样工作,然后开始更改其中的某些片段,同时进行检查,以确保其仍然按预期那样运行。知道了如何修改已有的脚本后,接下来您就可以考虑从头开始编写全新的脚本。
当然,即使到那时,我们仍然建议您尽可能修改已有的脚本。毕竟,任何 WMI、ADSI 或 ADO 脚本的精华部分都将是样本代码,这些代码很少(即使有)因脚本变化而变化。只要您键盘上的 Ctrl+C 和 Ctrl+V 还起作用,就没有必要一再重复地键入这些代码。(啊,是的,说到懒惰,脚本专家们确实在身体力行他们所宣扬的办法!)