C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: CSV出力時の挙動


(過去ログ 21 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■9114 / inTopicNo.1)  CSV出力時の挙動
  
□投稿者/ BAW (2回)-(2007/10/19(Fri) 11:09:20)

分類:[ASP.NET (VB)] 

おはようございます、いつもお世話になっております。

CSV出力時にこちらの予定したとおりに吐き出さず、悩んでおります。

SQLにてテーブルからデータを取得し、その内容をCSVに吐き出すという処理なんですが、
1件のみ→予定通りの出力
複数件該当→最初の1行目が出力されず、2行目からの出力

という状況になっています。
ちなみにSQLDataSouce上のクエリではこちらの予定どおりのデータは取得できております。

以下該当すると思われるソースを掲載いたしますのでご指摘よろしくお願いいたします。

環境
XPProSP2
VWDExpressEdition
SQLServer2005ExpressEdition

        '処理日付の結合用変数
        Dim syoridate As String
        syoridate = yearddl + monthddl + dateddl
        'CSV用SQLの発行
        'データベース接続文字列の型の宣言
        Dim sql_cn As New System.Data.SqlClient.SqlConnection
        'データベースを参照するSQL文の文字列の型の宣言
        Dim sql_set As System.Data.SqlClient.SqlCommand
        'Web.Configを参照する文字列の宣言
        Dim sql_ac As String = String.Empty
        'Web.Configを参照する
        sql_ac = System.Web.Configuration.WebConfigurationManager.ConnectionStrings("DBConString").ConnectionString
        'DBを開くために参照した文字列を代入
        sql_cn.ConnectionString = sql_ac
        sql_cn.Open()
        sql_set = sql_cn.CreateCommand()

    IF文での条件がありますが、割愛
        sql_set.CommandText = Me.SQLDS_OFFJ.SelectCommand
        sql_set.Parameters.AddWithValue("@TSSYRDATE", syoridate)
        sql_set.Parameters.AddWithValue("@TSOFFCD", offnm)

        Dim csv_o_put As System.Data.SqlClient.SqlDataReader
        csv_o_put = sql_set.ExecuteReader()
        Dim cnt_field As Integer = 1
        Dim csv_data As String = ""
        '取得件数分実行
        While (csv_o_put.Read())
            '取得フィールド回数分データを足しこんでいく
            Do Until cnt_field = csv_o_put.FieldCount
                csv_data += csv_o_put(cnt_field).ToString() + ","
                cnt_field += 1
            Loop
            csv_data &= System.Environment.NewLine
            cnt_field = 1
        End While
        'CSVファイルのダウンロード用形式の取得
        Response.AppendHeader("Content-Disposition", "attachiment; filename=d" + syoridate + ".csv")
        Response.ContentType = "application/octet-stream"
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("Shift_JIS")
        Response.Write(csv_data)
        Response.End()

引用返信 編集キー/
■9117 / inTopicNo.2)  Re[1]: CSV出力時の挙動
□投稿者/ BAW (3回)-(2007/10/19(Fri) 12:42:37)
コメント文の整理のち、今一度動作確認したところ、正常動作するようになりました。
たまたまうまく行っただけなのか、それとも・・・という感じです。

引き続き、検証を行っていきますが、スレッドの無駄遣いしたことをお詫びいたします。
解決済み
引用返信 編集キー/
■9119 / inTopicNo.3)  Re[2]: CSV出力時の挙動
□投稿者/ ぽぴ王子 (274回)-(2007/10/19(Fri) 12:55:13)
ぽぴ王子 さんの Web サイト
No9117 (BAW さん) に返信

じゃあ汚しついでに :-)

String 型のオブジェクトは、演算をすると別に String 型のオブジェクトを作って(新たにメモリを確保して)そこに
演算後のデータを移す処理が入ります。
どういうことかというと、元のソースでいうと csv_data に文字列を追加するたびに新しいメモリを確保→そこにコピー
という操作が入るので、繰り返していると遅くなると思われます。
なので、いつも自分がやる手段としてリスト型と String.Join を使った方法と String を StringBuilder に置き換えた
方法を混ぜてみました。
ソースはこんな感じで。

-----
        Dim csv_o_put As System.Data.SqlClient.SqlDataReader
        csv_o_put = sql_set.ExecuteReader()
        Dim cnt_field As Integer = 1
        Dim csv_data As New System.Text.StringBuilder()
        '取得件数分実行
        While (csv_o_put.Read())
            Dim fields As New List(Of String)
            For cnt_field = 0 To csv_o_put.FieldCount - 1
                fields.Add(csv_o_put(cnt_field).ToString())
            Next
            csv_data.AppendLine(String.Join(",", fields.ToArray()))
        End While
        'CSVファイルのダウンロード用形式の取得
        Response.AppendHeader("Content-Disposition", "attachiment; filename=d" + syoridate + ".csv")
        Response.ContentType = "application/octet-stream"
        Response.ContentEncoding = System.Text.Encoding.GetEncoding("Shift_JIS")
        Response.Write(csv_data.ToString())
        Response.End()
-----

というか、元ソースだと cnt_field が 1 から始まってますが、それは大丈夫ですか?
(SqlDataReader.Item プロパティを見ると 0 からとなってます)

解決済み
引用返信 編集キー/
■9122 / inTopicNo.4)  Re[3]: CSV出力時の挙動
□投稿者/ BAW (4回)-(2007/10/19(Fri) 13:15:36)
> というか、元ソースだと cnt_field が 1 から始まってますが、それは大丈夫ですか?
> (SqlDataReader.Item プロパティを見ると 0 からとなってます)

参考にさせていただきます。

ご指摘の箇所、まさにそのとおりでおかしいと思って修正したところでしたorz

引用返信 編集キー/
■9123 / inTopicNo.5)  Re[3]: CSV出力時の挙動
□投稿者/ なちゃ (69回)-(2007/10/19(Fri) 13:16:55)
1行目がなくなったのは、デバッグ実行とかして気づかないうちに読んじゃったとかじゃないかな。
文字列連結の話は、直接レスポンスに書き込むのが一番いいですよ。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -