0

SQL Server Studioで13000行を超える1秒かかるビューは、約2380行後にこのコードを実行しているASPページでタイムアウトになります。

これを行うためのより良い方法はありますか?運が悪かったので6ヶ月間探していました。

Server.ScriptTimeout=200
    dim updateNBK
    updateNBK = UCase(request.QueryString("SelTABLE"))

    dim allstring
    allstring = UCase(Request.QueryString("SelTABLE")) & " " & UCase(Request.QueryString("SelNBK"))


    allstring = LCase(allstring)
    dim checkforinject
    If(InStr(allstring, "'")<>0)then
        checkforinject = true
    Elseif(InStr(allstring, "--")<>0)then
        checkforinject = true
    End If

    If (checkforinject = true) then
        Response.Write("<b>Injection Detected</b><br/> You may not enter the following characters: ' or --")
    Elseif (checkforinject = false) then

    dim strSQL


        if(Request.QueryString("submitbutton") = "Download") then

        strSQL = "select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS  where TABLE_NAME = '" & UCase(request.QueryString("SelTABLE")) & "'"


        On Error Resume Next
        set arn = cnt.execute(strSQL)   

        dim datastr
        dim datahead
        datahead = "<table class='bluetable'><thead><tr><td colspan='30'>" & UCase(request.QueryString("SelTABLE")) & " contents</td></tr></thead>"
        dim columns
        colums = 0
        datastr = datastr & "<tbody class='datasheet'><tr class='selectblue'>"
        if not arn.EOF then
                    arn.movefirst

                    do
                        On Error Resume Next
                        datastr = datastr & "<td>" & arn(0) & "</td>"
                        columns = columns + 1
                        arn.movenext
                    loop until arn.EOF
                end if
        datastr = datastr & "</tr>"

        strSQL = "Select * from " & UCase(request.QueryString("SelTABLE"))

        if(UCase(Request.QueryString("SelNBK")) <> "") then

        strSQL = strSQL & " where SubmitterNBK = '" & UCase(Request.QueryString("SelNBK")) & "'"

        end if

        set arn = cnt.execute("Select TimestampColumnName from FormsInfo where FormOutput='" & UCase(request.QueryString("SelTABLE")) & "'")

        strSQL = strSQL & " ORDER BY " & arn(0) & " desc;"

        Response.Write "Test1"

        On Error Resume Next
        set arn = cnt.execute(strSQL)   
        dim counter
        counter = 0
        if not arn.EOF then
                    arn.movefirst
                    Response.Write "Test2"
                    dim cellnum
                    do
                    datastr = datastr & "<tr>"
                        On Error Resume Next
                        cellnum = 0
                        'datastr = datastr & "<td>" & arn.value.toString() & "</td>"
                        do
                        datastr = datastr & "<td>" & arn(cellnum) & "</td>"
                        cellnum = cellnum + 1
                        loop while cellnum < columns
                        arn.movenext
                        'Response.Write "TestLoop"
                        Response.Write "<br/>Loop ran " & counter & " times." 
                        counter = counter + 1
                    datastr = datastr & "</tr>"
                    loop until arn.EOF
                    Response.Write "<br/>Loop ended." 
        end if


        datahead = "<table class='bluetable'>"

        Response.Clear  

        Response.ContentType = "application/vnd.ms-excel" ' arbitrary 

        Response.AddHeader "Content-Disposition","attachment; filename=" & UCase(request.QueryString("SelTABLE")) & ".xls"

        Set adoStream = CreateObject("ADODB.Connection") 
        adoStream.Open() 
        adoStream.Type = 2

        Response.Write datahead & datastr 
        Response.Flush

        adoStream.Close 
        Set adoStream = Nothing 
        Response.End
4

2 に答える 2

2

あなたの問題は、VBScriptが文字列の連結でひどいという事実にあると思います-それはあなたがたくさんやっているようです。

.NET StringBuilderクラスはVBScriptで使用できませんが、いくつかの便利なライブラリ/コードサンプルを使用できます。一例はここにあります:http ://www.eggheadcafe.com/articles/20011227.asp

コードを少し手直しする必要があるかもしれませんが、パフォーマンスは大幅に向上すると思います。

上記のリンクのコードを使用した例を次に示します。FastStringクラスをインクルードファイルに配置して、他の場所で再利用できるようにすることをお勧めします。

Dim test : Set test = new FastString
Dim I
For I = 0 To 1000
  test.Append("TESTING")
Next
Response.Write test.Concat

上記のリンクからのコード:

Class FastString
  Dim stringArray, growthRate, numItems
  Private Sub Class_Initialize()
    growthRate = 50: numItems = 0
    ReDim stringArray(growthRate)
  End Sub
  Public Sub Append(ByVal strValue)
    ' next line prevents type mismatch error if strValue is null. Performance hit is negligible.
    strValue=strValue & ""
    If numItems > UBound(stringArray) Then ReDim Preserve stringArray(UBound(stringArray) + growthRate)
    stringArray(numItems) = strValue: numItems = numItems + 1
  End Sub
  Public Sub Reset
    Erase stringArray
    Class_Initialize
  End Sub
  Public Function Concat()
    Redim Preserve stringArray(numItems)
    concat = Join(stringArray, "")
  End Function
End Class

代替ソリューション:

スタイル付きのセルがなくてもかまわない場合は、ADOレコードセットの「GetRows」機能を利用できます。このほとんど使用されていないソリューションは、この状況で非常に役立ちます。

Dim tableRows : tableRows = arn.GetString(,,"</td><td>","</td></tr><tr><td>","&nbsp;")
Response.Write "<table class='bluetable'>" & tableRows & "</table>"

したがって、出力は次のようになります。

Set arn = cnt.Execute(strSQL)   
Response.Clear  
Response.ContentType = "application/vnd.ms-excel"
Response.AddHeader "Content-Disposition","attachment; filename=" & UCase(request.QueryString("SelTABLE")) & ".xls"
Dim tableRows : tableRows = arn.GetString(,,"</td><td>","</td></tr><tr><td>","&nbsp;")
Response.Write "<table class='bluetable'>" & tableRows & "</table>"
于 2012-07-30T21:18:30.183 に答える
0

私はそれを構築しているストリングがそれをとても遅くしているのではないかと思います。VBScriptはこれでひどいです。

私はこの種の作業を行うためにclsStringと呼ばれるクラスを使用していました。

これだと思います:http://pcdispatchwiki.com/Intranet/includes/funcsSubsClasses.asp

メモリから:

dim tmpStr : set tmpStr = new clsString
tmpStr.add "Hello"
tmpStr.add vbCRLF
tmpStr.add "World"
dim finalText : finalText = tmpStr.Value
于 2012-07-31T11:28:29.973 に答える