ADODB.RecordSet选择Distinct命令,在没有空值的情况下返回空值

时间:2012-04-17 16:41:08

标签: vbscript distinct adodb recordset

堆栈溢出,我整个上午都吹嘘这个问题。 我正试图用脚本帮助一个同事。他不是程序员,他只是从互联网上删除了一些代码,并要求我修改它以给出他想要的结果。我仔细考虑了它并废弃了所有不必要的部分并重写了它,所以它以我理解的方式做我想做的事情。我应该诚实地说,我只在这些情况下处理VBscript,当一个同事有一个需要修复时。我拥有VB6的VB经验。

该脚本的目的是采用以换行符分隔的文本文件。可能填充重复的条目,并输出它删除所有重复项。

Set objConnection = CreateObject("ADODB.Connection")
Set objRecordSet = CreateObject("ADODB.Recordset")

strPathToTextFile = "C:\Scripts\"
strFile = "Test.txt"
strOutputFile = "C:\this_is_the_output_changeme.txt"

Dim objFSO, objFile
Set objFSO = CreateObject("Scripting.FileSystemObject")
set objFile = objFSO.CreateTextFile(strOutputFile)

sql = "Select DISTINCT * FROM " & strFile

objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & strPathtoTextFile & ";" & _
          "Extended Properties=""text;HDR=NO;FMT=Delimited"""

objRecordSet.Open sql, objConnection

Do Until objRecordSet.EOF
    objFile.Write(objRecordSet.Fields.Item(0).Value)
    objFile.Write(vbCrLf)
    objRecordSet.MoveNext
Loop

objFile.Close

看起来很稳固吧?它工作正常....取决于输入文件。所以这就是问题所在,有时它就像一个魅力,有时它会混淆并报告所有非数字条目作为单个不同的空。

以下两个示例输入正常工作:

0
1
1
2
3
4
5
3
5
6
7
8
9
9
9

将输出:

0
1
2
3
4
5
6
7
8
9

此输入

gray
grey
gray
graey
greay
grey
gray
greasy
greay

输出:

graey
gray
greasy
greay
grey

但是很多其他输入导致此特定脚本因类型不匹配错误而崩溃。如果我用Wscript.echo换掉objFile.Write,我可以看到objRecordSet返回空值。

重新创建此错误的最简单输入是:

1
1
a
a

如果我回应这个输入,我得到:

null
1

基本上,字母和数字的任何组合都会产生此错误。所有字母都以单个null的形式返回,数字很好。

这对我来说似乎很奇怪。似乎RecordSet得出结论,如果有一些数字值,它只会接收数字值,并将所有字母抛出为空数字。据我所知,在任何输入中都会出现此错误,其中数字条目的数量是字母条目数量的一半

我无法确定指定将所有返回的项目作为字符串接收的方法。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是由于(一个且唯一的)列的数据类型的驱动程序引起的。通过将schema.ini文件放在数据源文件夹中来帮助驱动程序。

我的schema.ini用于此演示:

[numbers.txt]
Format=TabDelimited
ColNameHeader=False
Col1=F1 FLOAT

[texts.txt]
Format=TabDelimited
ColNameHeader=False
Col1=F1 TEXT

[mixed.txt]
Format=TabDelimited
ColNameHeader=False
Col1=F1 TEXT

演示代码:

  Const adClipString = 2

  Dim oCN     : Set oCN = CreateObject("ADODB.Connection")
  Dim sTDir   : sTDir   = goFS.GetAbsolutePathName("..\data")
  Dim aTables : aTables = Array("numbers.txt", "texts.txt", "mixed.txt")

  oCN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & sTDir & ";" & _
          "Extended Properties=""text;HDR=NO;FMT=TabDelimited"""

  Dim sTable
  For Each sTable In aTables
      Dim sFSpec : sFSpec = goFS.BuildPath(sTDir, sTable)
      WScript.Echo "  In:", Replace(goFS.OpenTextFile(sFSpec).ReadAll(), vbCrLf, " ")
      WScript.Echo "Seen:", oCN.Execute("SELECT * FROM [" & sTable & "]").GetString(adClipString, , "", " ", "NULL")
      WScript.Echo " Out:", oCN.Execute("SELECT DISTINCT * FROM [" & sTable & "]").GetString(adClipString, , "", " ", "NULL")
  Next
  oCN.Close

QED输出:

Unique00 - unique via ADO Text Driver
=================================================
  In: 2,05 2 1 2,5 3 2,05 2
Seen: 2,05 2 1 2,5 3 2,05 2
 Out: 1 2 2,05 2,5 3
  In: grey gray gray
Seen: grey gray gray
 Out: gray grey
  In: 1000 grey 10 gray 9 gray 9 1 gray
Seen: 1000 grey 10 gray 9 gray 9 1 gray
 Out: 1 10 1000 9 gray grey
=================================================
xpl.vbs: Erfolgreich beendet. (0) [0.67188 secs]