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()呼び出しの一部としてレコード境界にあるときだけなので、正しい数の行を取得することを期待していますが、各行は new でどんどん長くなります行の最後に追加されたもの。ファイルを右にスクロールすると、各行にアイテムが表示されるはずです。

これは、以下の私のコードが問題全体を修正するはずであることを意味します。


コードを追加してリセットするのではなく、csv 変数をクリアしてバグを修正するには、バッファ文字列変数を完全に回避するように変更し、すべてをストリームに直接書き込みます。また、ストリームを頻繁にフラッシュするコードも追加しました。これらの変更は、Web コンテキストでは重要です。バッファをフラッシュしないと、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 に答える