2013-05-22 53 views
1

已經要求我在ASP Classic的網站上創建一種「導出」功能。從ASP經典中的MySql表中創建一個CSV

我認爲這可能非常簡單,但我有一些問題。我在文件中得到了正確的行數,但是我總是獲得相同的記錄集行,就像記錄集在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 

我想不通,爲什麼我得到的第一排nn等於在記錄行數。

有什麼建議嗎?我是否採取了錯誤的方式來做到這一點?

回答

3

我確實發現了一個錯誤,但這些結果對我來說似乎也很陌生。我看到的錯誤是你在每次迭代時都沒有清除你的csv變量。我期望的是你有n(log n)行數,因爲在寫每一個新行時,你也會重複之前所做的一切。


更新:再次讀這篇文章,你寫一個新的生產線是在記錄邊界作爲f.WriteLine()調用的一部分唯一的一次,所以我想到的是,你得到的行權數量,但每一行將會越來越長,並在行的末尾添加新的東西。將文件向右滾動,我打賭你會看到每行中的項目。

這意味着我的代碼在下面應該修復你的整個問題。


修復bug與清除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 
+0

其實這個工作,但我必須把NULL值檢查f.write和刷新之前,給我一個500錯誤其實我已經刪除,並一切都好現在我會檢查一些轉機。非常感謝! –

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的directly generate the output file

SELECT * 
FROM sometable 
INTO OUTFILE 'C:\\path\\to\\thebackupfile.csv' 
FIELDS TERMINATED BY ';' 
ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
+0

太糟糕了我有一個公共主機的MySQL,所以我不能使用INTO OUTFILE,但這真是一件好事,我不知道它!謝謝! –