DataTableとDataSetについて(クリレポ 2010)


穂樹  2012-02-01 15:11:27  No: 147482  IP: 192.*.*.*

お世話になります。

以下の環境で次の現場のための勉強をしています。

・VB.NET 2010
・クリスタルレポート2010
・Oracle 10g (ODP接続)

実際、表示は出来るのですが、他にスマートな方法はあるのでしょうか。
問題の箇所は「本当かこれ??」の部分です。
.Netの経験が浅く、oracleのグリットの考え方やDataSet、DataTableに疎いです。

ご教授頂ければありがたいです。
宜しくお願い致します。


DataSet1.xsd(レポートに紐付けしているデータテーブル) は以下の通りです。

DataTable1(架空の表)
・DataColumn1
・DataColumn2
・DataColumn3
・DataColumn4

ソースのURL(7日以内に削除されます。)
http://firestorage.jp/download/2dc5f34811f3225ab357b7516b9c5a9fa907652b


ソース

        Dim cnn As New OracleConnection("user id=test1;password=test1;data source=XE")
        Dim strSql As String = "SELECT * FROM SAMPLE1 ORDER BY ID"
        Dim cmd As New OracleCommand(strSql, cnn)
        Dim da As New OracleDataAdapter(cmd)

        Dim Obj_CrRpt As New CrystalReport2
        Dim dsTemp As New DataSet1()
        Dim dt As New DataTable()

        Try

            'A4サイズ
            Obj_CrRpt.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.PaperA4
            '横帳票
            Obj_CrRpt.PrintOptions.PaperOrientation = CrystalDecisions.Shared.PaperOrientation.Landscape


            '---------------------
            '  ↓  本当かこれ??
            '---------------------
            da.Fill(dt)
            dsTemp.DataTable1.Merge(dt)
            For intCount As Integer = 0 To dt.Rows.Count - 1

                dsTemp.DataTable1.Rows(intCount).Item(0) = dt.Rows(intCount).Item(0)
                dsTemp.DataTable1.Rows(intCount).Item(1) = dt.Rows(intCount).Item(1)
                dsTemp.DataTable1.Rows(intCount).Item(2) = dt.Rows(intCount).Item(2)
            Next
            '---------------------
            '  end
            '---------------------

            '---------------------
            '  ↓ なぜできない??
            '---------------------
            'da.SafeMapping.Add("DataColumn1", GetType(System.String))
            'da.SafeMapping.Add("DataColumn2", GetType(System.String))
            'da.SafeMapping.Add("DataColumn3", GetType(System.String))
            'da.SafeMapping.Add("DataColumn4", GetType(System.String))
            da.SafeMapping.Add("*", GetType(System.String))
            da.Fill(dsTemp, "DataTable1")
            '---------------------
            '  end
            '---------------------

            Obj_CrRpt.SetDataSource(dsTemp)

            CrystalReportViewer1.ReportSource = Obj_CrRpt
            CrystalReportViewer1.Refresh()
        Catch ex As Exception
            'エラーログ
            MessageBox.Show("正しい値を入力してください。", _
                "エラー", _
                MessageBoxButtons.OK, _
                MessageBoxIcon.Error)
            ''Call grLib_Cls_Main.Lib_Cls_LogOutPut(grStr_ChekTrace & " OleDbDataReader", ex)
        Finally
            da.Dispose()
            cmd.Dispose()

        End Try

編集 削除
A2Z  2012-02-01 16:16:20  No: 147483  IP: 192.*.*.*

da.Fill(dsTemp)ではダメですか?

編集 削除
穂樹  2012-02-01 16:26:32  No: 147484  IP: 192.*.*.*

>da.Fill(dsTemp)ではダメですか?

回答、ありがとうございます。
実は既にこれは実行して中身が入っていない事を確認しています。

以下の領域が確保されていないため、エラーになります。
dsTemp.DataTable1.Rows(0).Item(0)  

逆に上記の場所に何らかの値が入っていればレポートには対象の値が正常に出力されます。

編集 削除
穂樹  2012-02-01 16:32:00  No: 147485  IP: 192.*.*.*

すみません、誤記がありました。

「以下の領域が確保されていないため、エラーになります。」
ではなく、
「エラーにはならないが値が無いので表示もされない状態」

です。
申し訳ありません。

編集 削除