DOBON.NET DOBON.NETプログラミング掲示板過去ログ

[.net2003]SQLのデータを纏めてDataGridのセルに〜

分類:[.NET]

お世話になります。
データベースから書類作成日と書類作成番号を取得するプログラムを作っています。
MySQL上では日付は 年 月 日 というふうにデータを分けてあるのですが、
プログラムではDataGridに書き出すときは年月日を纏めてひとつのセルに
書き出さないといけません。
さらに1〜9月、1〜9日のように1桁のところには0を詰めないといけません。
作成年月日も3つに分かれたデータを1つのセルに纏めて書き出さないといけません。
そこでこのような実装をしたのですが・・・2800件オーダーで20秒かかります。
100件程度で1秒強、1000件で7秒です。
ちょっと遅すぎるのでもう少し早くしたいのですがいい方法はないでしょうか?
よろしくお願いします。
(dr2にSQLを発行して取得したデータを入れてそれを引数に取って処理しています)

 Private Sub DataInsertForGrid(ByVal dr2)
        Dim MitumoriConnect1st As String
        Dim MitumoriConnect2nd As String
        Dim MitumoriConnect3rd As String
        Dim FullMitu As String
        Dim SakuseiConnectNen As String
        Dim SakuseiConnectTuki As String
        Dim SakuseiConnectHi As String
        Dim FullSaku As String
        Do While dr2.Read = True
            DataTable1.Rows.Add(DataTable1.NewRow())

            Dim WritePointer As Integer = 0
            For WritePointer = 0 To MaxKensakucol
                Select Case WritePointer
                    Case 0 REM 見積番号1
                        MitumoriConnect1st = dr2(0)
                    Case 1 REM 見積番号2
                        MitumoriConnect2nd = dr2(1)
                    Case 2 REM 見積番号3 
                        MitumoriConnect3rd = dr2(2)
                        REM ここで見積番号1〜3を合体させて
                        FullMitu = CStr(MitumoriConnect1st) & "-" & CStr(MitumoriConnect2nd) & "-" & CStr(MitumoriConnect3rd)
                        DataGrid1.Item(RowMakeCounter, 0) = FullMitu
                    Case 3 REM 社名
                        DataGrid1.Item(RowMakeCounter, 1) = dr2(3)
                    Case 4 REM 年
                        SakuseiConnectNen = dr2(4)
                    Case 5 REM 月
                        SakuseiConnectTuki = dr2(5)
                        If SakuseiConnectTuki.Length = 1 Then
                            SakuseiConnectTuki = "0" & SakuseiConnectTuki
                        End If
                    Case 6 REM 日
                        SakuseiConnectHi = dr2(6)
                        If SakuseiConnectHi.Length = 1 Then
                            SakuseiConnectHi = "0" & SakuseiConnectHi
                        End If
                        REM ここで年月日を合体させて
                        FullMitu = CStr(SakuseiConnectNen) & "-" & CStr(SakuseiConnectTuki) & "-" & CStr(SakuseiConnectHi)
                        DataGrid1.Item(RowMakeCounter, 2) = FullMitu
                End Select
            Next
            RowMakeCounter += 1
        Loop
    End Sub
2006/02/09(Thu) 02:32:18 編集(投稿者)

お世話になります。

■No14941に返信(あおぞらさんの記事)
SELECT 文の中で、年月日の文字列を結合して、日付型にキャストして、
http://dev.mysql.com/doc/refman/4.1/ja/cast-functions.html
DATE_FORMAT 関数を使うとか
http://dev.mysql.com/doc/refman/4.1/ja/date-and-time-functions.html

もしくは、

SELECT 文の中で、年月日の文字列を結合して、日付型にキャストして、
それを、.NET 側で DateTime 型で受け取って、
Dim d As DateTime = ...
d.ToString("yyyy-MM-dd")
とか。

>FullMitu = CStr(MitumoriConnect1st) & "-" & CStr(MitumoriConnect2nd) & "-" & CStr(MitumoriConnect3rd)
あと、↓このようなお話がありますね。
http://sonic64.com/2005-11-30.html
なおこ(・∀・)様
素早い返信に感謝します。

MySQLのバージョンが4.0でサブクエリが使えないのでMySQL側で何とかすることは
難しいようです。
とりあえず・・・
 1意味のないループ(For構造とSelect構造)の削除
 2DataSetを生成するときにSuspendLogicする
これで4秒程度削れました。
現状のSQL文は
書類番号1、書類番号2、書類番号3、取引相手、作成年、作成月、作成日を
Select分で抜いてdr2に入れているので、
書類番号1、書類番号2、書類番号3をSQLで纏めてそれをサブクエリにしてほかの
データを持ってこようとしたのですが
サブクエリは使えないようなのでほかの方法で行くしかなさそうです。

SQL側じゃなくてVB側でこれもやっとけ!って言う方法がありましたら
教えてください。
お願いします。
すいません
サブクエリは使えなくて問題なかったです。
MySQLに明るくないので思いっきり勘違いしていました。
現状は
作成番号1〜3、取引相手、年、月、日のデータを持ってきています。
年、月、日のデータを上手く纏める方法はウェブサイトを見て調べましたが
いまひとつ理解できなかったのでこれはプログラムで纏める方向になりそうです。
これでさらに2秒くらい速くなりそうですが、もう少し速くしたいです。
アイデアがあればお願いします。
もう動いてるシステムのデータベースなんですか。
これからなんだったら、はなから月や日は保存時に0で桁埋めして
持ってる方がいいんじゃないですか。

というのは、まぁ余談として…

SELECT LPAD(年,4,'0')+'-'+LPAD(月,2,'0')+'-'+LPAD(日,2,'0') as 年月日
あたりでくっつけて取ってくればいいだけなのでは。
(LPADの文法とかは「なおこ(・∀・)」さんが示してるリンク先で調べてください。)
こど。様
返信ありがとうございます。

> もう動いてるシステムのデータベースなんですか。
> これからなんだったら、はなから月や日は保存時に0で桁埋めして
> 持ってる方がいいんじゃないですか。

稼動しているシステムの改造ということでやらせてもらっています。
DBの構造変更もOKとのことで考えたのですが、今度はアプリケーションで
使うときに0を取って欲しいとのことだったのでどちらにしても一手間なので
止めました(SQLがよく分かってないので稼動しているシステムに手を加える
のは・・・というのもありますが)

> SELECT LPAD(年,4,'0')+'-'+LPAD(月,2,'0')+'-'+LPAD(日,2,'0') as 年月日
> あたりでくっつけて取ってくればいいだけなのでは。

LPADを使えば簡単に出来そうです。
早速実装させていただきます。

これにて解決とさせていただきます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板