1

有人要求我在 ASP Classic 中的网站上制作一种“导出”功能。

我认为制作起来可能很简单,但我遇到了一些问题。我在文件中得到了正确的行数,但我总是得到相同的记录集行,就像记录集在 foreach 循环期间没有更新值一样。

这是我的代码:

dim fs,f
set fs = Server.CreateObject("Scripting.FileSystemObject")
set f = fs.OpenTextFile(Server.MapPath("thebackupfile.csv"), 8, true)

set RS = conn.execute("SELECT * FROM sometable")

For each fField in RS.Fields 
    row = row & " " & fField.Name & ";"     
Next

row = left (row, len(row)-1)

f.WriteLine(row)

do while not RS.EOF
    For each fField in RS.Fields 
        csv = csv &" "& RS(fField.Name) & ";"     
    Next
    csv = left (csv, len(csv)-1)

    f.WriteLine(csv)
    RS.movenext
loop

f.Close
set f = Nothing
set fs = Nothing

我不知道为什么我得到n的第一行的时间n等于记录集中的行数。

有什么建议吗?我是否采取了错误的方式来做到这一点?

4

2 回答 2

3

我确实发现了一个错误,但这些结果对我来说也很奇怪。我看到的错误是您没有在每次迭代时清除 csv 变量。我所期望的是你会有 n(log n) 行,因为在编写每一行时,你还会重复之前的所有内容。


更新:再读一遍,你写一个新行的唯一时间是作为f.WriteLine()调用的一部分在记录边界,所以我期望你得到正确的行数,但每一行会越来越长,新的添加到行尾的东西。向右滚动文件,我敢打赌你会看到每一行中的项目。

这意味着我下面的代码应该可以解决您的整个问题。


要通过清除 csv 变量来修复错误,而不是添加代码来重置它,我会更改一些内容以完全避免缓冲区字符串变量,并将所有内容直接写入您的流。我还添加了代码来经常刷新流。这些变化在网络环境中很重要。如果您不刷新缓冲区,您的浏览器可能很长时间都看不到来自 Web 服务器的任何响应,这可能会导致超时错误。鉴于这是标记asp-classic的,我想知道您是否写入文件,而不是响应流。

dim fs,f,d
set fs = Server.CreateObject("Scripting.FileSystemObject")
set f = fs.OpenTextFile(Server.MapPath("thebackupfile.csv"), 8, true)
d = ""

set RS = conn.execute("SELECT * FROM sometable")

For each fField in RS.Fields 
    f.Write(d)
    f.Write(fField.Name)
    f.Write(" ")
    d= ";"     
Next

f.WriteLine("")

Dim i
i = 0

do while not RS.EOF
    d = ""
    For Each fField in RS.Fields 
        f.Write(d)
        f.Write(" ")
        f.Write(RS(fField.Name))
        d = ";"    
    Next

    f.WriteLine("")
    RS.movenext

    i = i + 1
    If i Mod 50 = 0 Then
       f.Flush
    End If
Loop

f.Close
set f = Nothing
set fs = Nothing
于 2013-05-22T15:37:38.920 回答
1

您应该首先将记录的值加载到数组中,然后将该数组连接到分隔符分隔的行中,然后将该行写入输出文件:

set RS = conn.Execute("SELECT * FROM sometable")

fields = Array()
Redim fields(RS.Fields.Count-1)

For i = 0 To RS.Fields.Count-1
  fields(i) = RS.Fields(i).Name
Next
f.WriteLine """" & Join(fields, """;""") & """"

Do Until RS.EOF
  For i = 0 To RS.Fields.Count-1
    fields(i) = RS.Fields(i).Value
  Next
  f.WriteLine """" & Join(fields, """;""") & """"

  RS.MoveNext
Loop

然而,比这更好的是让 MySQL直接生成输出文件

SELECT *
FROM sometable
INTO OUTFILE 'C:\\path\\to\\thebackupfile.csv'
FIELDS TERMINATED BY ';'
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
于 2013-05-22T21:06:10.997 回答