0

エクスポート用のファイルを返すために使用しています。このエクスポートを多くのレコードで実行すると、実行に10分近くかかります。これは、実際にFile()メソッドを呼び出して結果を返すコードのコードスニペットです。

Public Function Export(ByVal ID As Integer) As FileContentResult
  Dim str As String = String.Empty
  Dim data() As Byte
  Dim r As New ExportResult
  Dim Test As New TestConnection(WebUtil.UserToken)

  'This line is important coz IE download was prevented without this.
  ControllerContext.HttpContext.Response.ClearHeaders()

  r = Test.ExportFile(ID)
  data = Encoding.ASCII.GetBytes(r.ResponseString)

  Return File(data, "text/plain", r.DefaultFileName)

End Function

実際のExportFileメソッドはIDを受け取り、別のメソッドを呼び出します。このメソッドは、データベースから一連のレコードを取得し、各行で一連の計算を実行してからStringBuilderを作成し、各行についてStringBuilderにデータを入力してからにポップします。 .ToString()を実行した後のList(Of String)。次に、このメソッドはList(Of String)をExportFileメソッドに返し、このメソッドは別のStringBuilderを作成し、そのリストからすべての文字列を追加し、それを1つの大きな文字列に変換して、結果のResponseStringプロパティに設定します('r '上記のコードで)。

それがその仕組みです。とにかく、このプロセスをスピードアップする方法はありますか?

-スコット

編集:その他のコード

Public Function ExportFile(ByVal ID As Integer) As ExportResult
            Dim result As New ExportResult
            Dim s As New StringBuilder

            'Get all Records
            Dim dt As New DataTable
            Using dal As New SQL
                dal.Parameters.AddWithValue("@ID", ID)
                dal.Execute("[dbo].[uspGet]", dt)
                dal.Parameters.Clear()
            End Using

            Dim dataobj As New DataObj(dt, ID)

            'Create FileName
            If dt.Rows.Count > 0 Then
                Dim StartDate As DateTime = DateTime.Parse(dt.Rows(0).Item("StartDate"))
                Dim EndDate As DateTime = DateTime.Parse(dt.Rows(0).Item("EndDate"))
                result.DefaultFileName = String.Format("HMDA_{0}_{1}.dat", String.Format("{0:MMyyyy}", StartDate), String.Format("{0:MMyyyy}", EndDate))
            End If

            'Add Title Line
            s.AppendLine(dataobj.CreateTitleLine())

            'Add all Record Lines
            Dim records As List(Of String) = dataobj.CreateRecordLines()
            Dim last As Integer = records.Count - 1
            For i = 0 To last
                If i = last Then
                    s.Append(records(i))
                Else
                    s.AppendLine(records(i))
                End If
            Next

            result.ResponseString = s.ToString

            Return result
End Function
4

2 に答える 2

1

SQLのパフォーマンスはどれくらいですか?私はあなたの問題についてそこでチェックし始めます。

次に、ファイルの大きさを検討します。データは引き続きクライアントでダウンロードする必要があります。

于 2010-08-03T17:09:49.087 に答える
0

余分なコピーを避けますか?たぶん、バイトへの変換やファイルの作成を避けることができます。この余分な作業なしで、応答に文字列を書き込むだけです。

于 2010-08-03T17:51:58.220 に答える