none
Microsoft ReportViewerコントロール(WEB)について RRS feed

  • 質問

  • お世話になります。

    WEBフォームでMicrosoft ReportViewerコントロールを利用したく

    Windowsフォームでは新しいレポート定義ファイル(rdlcファイル)を作成後、

    レポートデザイン画面のツールボックスから「テーブル」を選択するとデータソース構成ウィザードで

    「データベース」、「サービス」、「オブジェクト」、「SharePoint」の4つが選択できるのですが、

    Webフォームですと、データソース構成ウィザードで「データソース接続の選択」1つしか出てきません。

    webフォームでwindowsフォーム同様のオブジェクト参照など、

    テーブル直接ではなく、加工したデータ(DataTableなど)で渡したいのですが

    方法が分かりません。どのようにすれば良いでしょうか?

    -----------------------------------------------------------------

    開発用PC

    Windows8 Pro、VsiaulStudio2012(ASP.net C#)、ASP.NET開発サーバ、Framework4.5
    MySQL Server 5.6、MySQL Connector Net 6.6.5
    -------------------------------------------------------------------
    実行環境 (レンタルサーバ:WILLNET)
    Windows Server 2012、Microsoft-IIS/8.5、Framework4.5
    MySQL Community Server 5.1.73、mysqlnd 5.0.11-dev

    -------------------------------------------------------------------

    2015年2月9日 16:12

回答

  • >>MySQLから取得したデータを加工したいということなのでしょうか? それとも、データベースとは全く関係なく、
    >>独自にDataTableを用意して、それをデータソースにしたいということなのでしょうか? 
    >
    > については、後者です。後者が理解できれば前者にも対応できると考えておりました。

    それについては、私の一番最初にレスで紹介した案ではダメなのですか?

    具体的には、私の上から 4 つ目のレスに書いたように、DataTable を渡すためのクラスファイル/メソッドを作って、ObjectDataSource1 の SelectMethod, TypeName プロパティを差し替えるということです。

    これが質問者さんの目的に適わないということでしたら、具体的にどこが問題か教えていただければ、対応案を考えて見ます。

    • 回答としてマーク hys73 2015年2月12日 11:39
    2015年2月12日 10:18

すべての返信

  • いくつか参考になりそうなサイトをご紹介します。

    Using datatable as datasource in micrsosoft report viewer
    http://stackoverflow.com/questions/11672237/using-datatable-as-datasource-in-micrsosoft-report-viewer

    How to bind datatable to reportviewer
    http://forums.asp.net/t/1851513.aspx?How+to+bind+datatable+to+reportviewer

    Populating a web reportviewer with a datatable as the datasource
    http://forums.asp.net/t/1910906.aspx?Populating+a+web+reportviewer+with+a+datatable+as+the+datasource

    How to Create Report using Report Viewer in ASP.NET
    http://www.c-sharpcorner.com/Blogs/14000/how-to-create-report-using-report-viewer-in-Asp-Net.aspx

    RDLC Report Example in Asp.net with Dataset or Datatable in Visual Studio 2010
    http://www.aspdotnet-suresh.com/2014/12/rdlc-report-example-in-aspnet-with-dataset-datatable-in-visual-studio-2010.html

    DLC (Local SSRS) Report ASP.Net Example using DataSet or DataTable in C# VB.Net and Visual Studio 2010
    http://www.aspsnippets.com/Articles/RDLC-Local-SSRS-Report-ASPNet-Example-using-DataSet-or-DataTable-in-C-VBNet-and-Visual-Studio-2010.aspx


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年2月10日 2:08
    モデレータ
  • まずは以下のチュートリアルのようにウィザードで型付 DataSet + TableAdapter を作って、それをベースに .rdlc ファイルと .aspx ファイルを作った後で、質問者さんが言われる「加工したデータ(DataTableなど)」を渡すためのクラスファイル/メソッドのコードを書いて、それらを型付 DataSet + TableAdapter に代えて ObjectDataSource の TypeName, SelectMethod プロパティに設定しなおすという手段ではいかがでしょう?

    チュートリアル : ローカル処理モードでの ReportViewer Web サーバー コントロールとデータベースのデータ ソースの使用法
    https://msdn.microsoft.com/ja-jp/library/ms252123.aspx


    • 編集済み SurferOnWww 2015年2月10日 8:50 一部訂正
    2015年2月10日 8:45
  • 教えて頂いたチュートリアルをもとに
    DataSet + Datatableを作成(TableAdapterは利用しておりません)し、
    rdlc ファイルと .aspx ファイルを作成。
    空データですが、.aspxページでプレビューの表示は確認できました。

    ですが、「DataTableを渡すためのクラスファイル/メソッドのコードを書いて、
    それらを型付 DataSet + TableAdapter に代えて ObjectDataSource の
     TypeName, SelectMethod プロパティに設定しなおす」という部分で試行錯誤しております。

    DataSet1.xsdにDataTable1を定義し、
    同aspxファイルに下記のようにDataSourcesに連結してみたのですが、
    「データ ソース インスタンスがデータ ソース 'DataSet1' に指定されていません。」
    となってしまいます。

    var dt = new DataSet1.DataTable1DataTable();
    
    DataRow drow = dt.NewRow();
    
    drow[0] = "a";
    drow[1] = "b";
    drow[2] = "c";
    drow[3] = "d";
    
    dt.Rows.Add(drow);
    
    ReportViewer1.LocalReport.DataSources.Clear();
    ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataTable1", (DataTable)dt));
    ReportViewer1.LocalReport.Refresh();

    TableAdapterがないためかと思い、

    データセット作成時、TableAdapterを画面上にドラッグして作成すると

    自動でMySqlConnectionが作成されるようですが、

    既存のパブリッククラスで、下記のようにMysqlの接続を定義しているので、

    下記のエラーが出てしまい、ビルドができなくなってします。

    エラー 1 型 'MySql.Data.MySqlClient.MySqlConnection' は 'c:\Windows\Microsoft.NET\assembly\GAC_MSIL\MySql.Data\v4.0_6.6.5.0__c5687fc88969c44d\MySql.Data.dll' および 'c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\test_pjt150209\065e2f93\682daab4\assembly\dl3\261c249b\1f9f037a_d0edcf01\MySql.Data.DLL の両方に存在します。

    //MYSQL接続
            public static bool FunDBConnect(ref MySqlConnection con)
            {           
                try
                {
                    //DB接続
                    string conStr = WebConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
                    con = new MySqlConnection(conStr);
                    con.Open();
    
                    return true;
    
                } catch {
    
                    return false;
                    
                }                      
    
            }

    解決方法やお気づきの点などありましたら、教授頂ければと思います。


    2015年2月12日 2:23
  • ちなみに、

    >テーブル直接ではなく、加工したデータ(DataTableなど)で渡したいのですが

    というのは、MySQLから取得したデータを加工したいということなのでしょうか? それとも、データベースとは全く関係なく、独自にDataTableを用意して、それをデータソースにしたいということなのでしょうか? 私は後者だと思いましたが、前者だとやり方がいくつか考えられます。
    まず、一番簡単なのは、SQLだけでデータ加工をし、それをDataTableにFillすることです。
    この方法が無理な場合は、一旦、MySQLからDataTableにFillし、その後、このDataTableをアプリケーション側で加工してあげます。MySQLからDataTableにFillするにはTableAdapterを利用します。
    したがって、前者の場合には、いずれもTableAdapterが必要になります。


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年2月12日 2:41
    モデレータ
  • 先の自分のレスの手段は「Visual Studio のデザイン画面上でウィザードベースで .rdlc ファイルを完成させる」ということを前提に提案しています。(ウィザードに頼らなくても自力で作る方法はあるのかもしれませんが、それは置いといて・・・と言うより、自分は知りませんので提案できないので)

    > DataSet + Datatableを作成(TableAdapterは利用しておりません)し、
    > rdlc ファイルと .aspx ファイルを作成。
    > 空データですが、.aspxページでプレビューの表示は確認できました。

    上記のところは具体的にどうやったのでしょうか?

    紹介したチュートリアルの「DataSet の追加による、データ接続と DataTable の定義」セクションの手順 1 ~ 13 のような手段を用いて、型付 DataSet + TableAdapter(DataSet1.xsd ファイル)を作っておかないと、「Visual Studio のデザイン画面上でウィザードベースで .rdlc ファイルを完成させる」ということはできないはずなのですが。(自分がやり方を知らないだけという可能性は否定し切れませんが)

    DataSet1.xsd ファイルなしでチュートリアルの「レポート ウィザードを使用したレポートのデザイン」セクションの手順を行っても、手順 3 で開いた「レポートウィザード」ダイアログの[データーソース(D)]ドロップダウンリストには何も表示されず(他に .xsd ファイルがあればそれは表示されるかもしれませんが)、その先に進めないはずですが、いかがですか?

    AdventureWorks2008 サンプルデータベースを入手して、とにかく一度チュートリアルどおりに作ってみませんか? そうしていただけるとその先の話が通じやすくなると思いますので。

    チュートリアルどおり作ると以下のようなコードになるはずです。

    <%@ Page Language="C#" %>
    
    <%@ Register 
        Assembly="Microsoft.ReportViewer.WebForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
        Namespace="Microsoft.Reporting.WebForms" TagPrefix="rsweb" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <script runat="server">
    
    </script>
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
    
        <rsweb:ReportViewer ID="ReportViewer1" runat="server" Font-Names="Verdana" 
            Font-Size="8pt" InteractiveDeviceInfos="(コレクション)" 
            WaitMessageFont-Names="Verdana" WaitMessageFont-Size="14pt">
            <LocalReport ReportPath="C:\WebSites\WebSiteNET4\0097-Report.rdlc">
                <DataSources>
                    <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1" />
                </DataSources>
            </LocalReport>
        </rsweb:ReportViewer>
        <asp:ObjectDataSource ID="ObjectDataSource1" runat="server" 
            OldValuesParameterFormatString="original_{0}" SelectMethod="GetData" 
            TypeName="DataSet1TableAdapters.DataTable1TableAdapter">
        </asp:ObjectDataSource>
        </form>
    </body>
    </html>

    (注1)
    チュートリアルの SELECT クエリは修正が必要かもしれません。自分がダウンロードした AdventureWorks2008 サンプルのスキーマがチュートリアルのものと違っていて e.BusinessEntityID as EmployeeID ⇒ e.EmployeeID の修正が必要でした。


    (注2)
    チュートリアルの「アプリケーションへの ReportViewer コントロールの追加」の最後に、"レポートを選択すると、レポートで使用するデータ ソースのインスタンスが自動的に作成されます・・・" と書いてありますが、手順どおりやっても自動では生成されなかったので(理由不明)、以下の手順を追加して ObjectDataSource を生成しました。

    (1) 「ReportViewer タスク」メニューで[データソースの選択]をクリック。

    (2) 出てきた「データソースの選択」ダイアログで「データソースインスタンス」列の欄が(なし)になっているはずなのでそれをクリック。

    (3) その欄がドロップダウンリストになってその中に <新しいデーターソース...> が含まれているはずなのでそれをクリック。

    (4) データソース構成ウィザードが開いて「アプリケーションがデータを取得する場所(W)」にいくつか候補が表示され、その中に[オブジェクト]という項目があるはずなので、それをクリック。

    (5) クリックすると「データソースに ID を指定します(I)]の欄に自動的に ObjectDataSource1 と表示されるはず。それを確認して[OK]ボタンをクリック。

    (6) 「ビジネスオブジェクトの選択」ダイアログが開くので、ドロップダウンリストから先に作った TableAdapter(チュートリアルどおりに作ると DataSet1TableAdapters.DataSet1TableAdapter という名前のはず)を選択。[次へ(N) >]ボタンをクリック。

    (7) 「データメソッドの定義」ダイアログが開くので、「SELECT]タブの[メソッドの選択(C)]のドロップダウンリストで GetData() を選んで(というかそれしか選べないはず)、[完了(F)]ボタンをクリック。

    (8) 上記 (2) の「データソースの選択」ダイアログに戻るので、「データソースインスタンス」列が ObjectDataSource1 になっていることを確認して[OK]ボタンをクリック。


    • 編集済み SurferOnWww 2015年2月12日 6:50 一部訂正
    2015年2月12日 6:46
  • 【追伸】

    > 既存のパブリッククラスで、下記のようにMysqlの接続を定義しているので、
    > 下記のエラーが出てしまい、ビルドができなくなってします。

    それは多分参照設定の問題だと思います。

    少なくとも、そのエラーと「パブリッククラスで・・・定義している」は関係ないです。

    一番最初の質問にあった、

    > テーブル直接ではなく、加工したデータ(DataTableなど)で渡したいのですが

    というのが、上記のエラーで型付 DataSet + TableAdapter(.xsd ファイル)が作れないからという理由だけで、型付 DataSet + TableAdapter が作れればそれからデータを渡すことは OK ということであれば、参照設定を見直してエラーの原因を解決する方向に進むことをお勧めします。

    2015年2月12日 7:06
  • trapemiya さん>

    > 一番簡単なのは、SQLだけでデータ加工をし、それをDataTableにFillすることです。

    その先、私が先に紹介したチュートリアルと同様なレポートを表示できる方法はあるのでしょうか? ご存知でしたら教えていただけると幸いです。

    チュートリアルのデータソース構成ウィザードで作った型付 DataSet + TableAdapter で取得できる DataTable と同等なものは、例えば、以下のようなクラスファイル/メソッドを作れば作成できます。しかし、それからウィザードベースでは .rdlc ファイルは作成できないようです。

    自分がやり方を知らないだけかもしれません。何か方法があるのでしょうか?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Data;
    using System.Data.SqlClient;
    
    /// <summary>
    /// ReportViewerDataSource の概要の説明です
    /// </summary>
    public class ReportViewerDataSet
    {
    	public ReportViewerDataSet()
    	{
    		//
    		// TODO: コンストラクター ロジックをここに追加します
    		//
    	}
    
        public DataTable CreateDataTable()
        {
            string connectionString = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\AdventureWorks_Data.mdf;Integrated Security=True;User Instance=True";
            string query = 
                "SELECT d.Name as Dept, s.Name as Shift, e.EmployeeID " + 
                "FROM (HumanResources.Department d " + 
                "INNER JOIN HumanResources.EmployeeDepartmentHistory e " + 
                "ON d.DepartmentID = e.DepartmentID) " + "INNER JOIN HumanResources.Shift s " + 
                "ON e.ShiftID = s.ShiftID";
    
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(query, connection);
                DataTable table = new DataTable();
                adapter.Fill(table);
                return table;
            }
        }
    }

    ちなみに、先のレスでアップしたコードの ObjectDataSource1 で、SelectMethod="CreateDataTable" TypeName="ReportViewerDataSet" に変更すると同じ内容のレポートが表示されます。そういうわけで一番最初の自分のレスに書いた案を紹介しました。
    2015年2月12日 7:46
  • >その先、私が先に紹介したチュートリアルと同様なレポートを表示できる方法はあるのでしょうか? ご存知でしたら教えていただけると幸いです。

    私の書き方が悪く、うまく伝わっていないかもしれません。
    データソース構成ウィザードで作った型付 DataSet + TableAdapter を使用しますが、そのselect文が、例えば、
    select FullName + 'さま' from テーブル
    というように、SQLのみで加工することができれば、それで済みますということです。ただ、少し前にSurferOnWwwさんは別のスレッドで、この方法を提案されていましたので、もちろんご存知だと思います。ということは、私が何か取り違えているかな・・・?


    ★良い回答には回答済みマークを付けよう! MVP - .NET  http://d.hatena.ne.jp/trapemiya/

    2015年2月12日 8:11
    モデレータ
  • SurferOnWwwさんからご呈示頂いたサンプルデータベースを入手し、無事表示させることができました。
    また、この手順でMYSQLのデータもレポートとして表示することが出来ました。
    ありがとうございます。

    trapemiyaさんの
    >MySQLから取得したデータを加工したいということなのでしょうか? それとも、データベースとは全く関係なく、
    >独自にDataTableを用意して、それをデータソースにしたいということなのでしょうか? 

    については、後者です。後者が理解できれば前者にも対応できると考えておりました。

    現在、DataSetを作成し、レポートを表示することはできたので、
    trapemiyaさんからお教え頂いた下記にトライしているのですが、うまくいきません。

    >MySQLからDataTableにFillし、その後、このDataTableをアプリケーション側で加工してあげます。
    >MySQLからDataTableにFillするにはTableAdapterを利用します。


    1.追加→新しい項目の追加→DataSet.xsdを作成
        (DataTable名はm_corp、TableAdapter名はm_corpTableAdapter)

    2.Page_Loadイベントで下記を記述→加工した内容が表示されず、加工前の内容が表示されます。

    protected void Page_Load(object sender, EventArgs e)
        {         
            if (IsPostBack) return;
    
            //一旦、MySQLからDataTableにFill
            var mdt = new DataSet.m_corpDataTable();
            var da = new DataSetTableAdapters.m_corpTableAdapter();
            da.Fill(mdt);
    
            //その後、このDataTableをアプリケーション側で加工(行追加)
            DataRow drow = mdt.NewRow();
            drow[0] = "a";
            drow[1] = "b";
            drow[2] = "c";
            mdt.Rows.Add(drow);
            
        }

    3.データベースとは全く関係なく、独自にDataTableを用意して、データソースにできるかテストしてみましたが、

    こちらも加工前の内容(DataSetの内容)が表示されます

    protected void Page_Load(object sender, EventArgs e)
        {         
            if (IsPostBack) return;
    
            //一旦、MySQLからDataTableにFill
            var mdt = new DataSet.m_corpDataTable();
            var da = new DataSetTableAdapters.m_corpTableAdapter();
            da.Fill(mdt);
    
            //独自のDataTableを用意(データセットと同じテーブル名、フィールドを作成)
            DataTable _dt = new DataTable();
            _dt.TableName = "m_corp";
            _dt.Columns.Add("corp_id", Type.GetType("System.String"));
            _dt.Columns.Add("corp_name", Type.GetType("System.String"));
            _dt.Columns.Add("corp_eria", Type.GetType("System.String"));
    
            for (int i = 0; i < 4; i++)
            {
                DataRow row = _dt.NewRow();
                row["corp_id"] = "No" + i.ToString();
                row["corp_name"] = "文字列2";
                row["corp_eria"] = "文字列3";
                _dt.Rows.Add(row);
            }
    
            ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("m_corp", (DataTable)_dt));
            ReportViewer1.LocalReport.ReportPath = "Report.rdlc";
            ReportViewer1.LocalReport.Refresh();
           
            
        }

    何か勘違いしているかも知れませんが、アドバイス頂けると幸いです。


    2015年2月12日 9:00
  • trapemiya さん>

    誤解していたようで、すみません。

    まず最初に DataTable(.xsd ファイルではなく単純な DataTable) ありきで、それから .rdlc ファイルを作り、ReportViewer を表示する案と思ってました。

    2015年2月12日 10:15
  • >>MySQLから取得したデータを加工したいということなのでしょうか? それとも、データベースとは全く関係なく、
    >>独自にDataTableを用意して、それをデータソースにしたいということなのでしょうか? 
    >
    > については、後者です。後者が理解できれば前者にも対応できると考えておりました。

    それについては、私の一番最初にレスで紹介した案ではダメなのですか?

    具体的には、私の上から 4 つ目のレスに書いたように、DataTable を渡すためのクラスファイル/メソッドを作って、ObjectDataSource1 の SelectMethod, TypeName プロパティを差し替えるということです。

    これが質問者さんの目的に適わないということでしたら、具体的にどこが問題か教えていただければ、対応案を考えて見ます。

    • 回答としてマーク hys73 2015年2月12日 11:39
    2015年2月12日 10:18

  • ようやく意味が分かりました。
    ObjectDataSource1 の SelectMethod, TypeName プロパティを差し替えることで、
    ReportViewerDataSetクラスからデータを取得できるようになりました。

    また、このメソッド内で新しい独自のDataTableを作成し、Fillすることで、
    無事加工したデータが表示できるようになりました。

    これでやりたいことが実現できそうです。
    いろいろとご助言頂きありがとうございました.




    2015年2月12日 12:00