我三流

いろいろ自分なりにやってみたことを書いています

Visual Studio C# 2010 + Npgsql + Crystal Reports に挑戦しました

VC#には、Accessでいうレポート機能の部分が「Crystal Reports」というアプリケーションで
実現できるようになっているようで、「できるようになっている」と書いたのには理由があり
これを書いている時点(2010.8)のバージョンであるVisual Studio 2010 からは、
[プロジェクト]-[新しい項目の追加]-[Reporting]-[Crystal レポート]を選択すると

businessobjectsからダウンロードページを辿って、手動でダウンロードさせるようになっているためです。

Downloadしたファイル(2010.8時点では、ベータ版の cr4vs2010.exe)をダブルクリックして
インストールします。うちのPC(Core i5 M450 @2.40GHz メモリ3G)では、少し時間がかかりました。
インストールしたら一旦、Visual Studioを終了して、再起動したほうがいいかもしれません(自信無)

さて今回、Crystal Reportsを使って表示させたいデータは
自宅イントラ内のFreeBSD 8.0サーバー(192.168.0.30)に構築した
RDBMSの PostgreSQL8.4のデータベースyu2にあるテーブルusersのデータです。
(このサーバー及び、DB部分は構築済みであるという前提で説明は割愛します。)

// テーブル[users]の構成
 id (PRYMARY KEY)
 first_name (string)
 last_name (string)
 first_phonetic (string)
 last_phonetic (string)
 age (int)
 g_id (int)
 postal_code (string) 
 address (string)
 n_id (int)
 flg (int)

Visual Studio C#PostgreSQLに接続するために

Npgsql
Postgresql のための Npgsql .Net データプロバイダ)
を使っています。これを使うとVisual Studio C#からPostgreSQLサーバーに接続する
クライアントPCにODBC接続定義を作成しなくてもよいというメリットがあります。


まずCrystal Reportsで表示するためのデータセットを作ります。

「プロジェクト」-「新しい項目の追加」-右側のテンプレートから「データセット」を選択して
ファイル名をuser.xsdとして、データセットを作成して、ここでいったん保存します。
さらに、データセットuser.xsdに任意のカラムを作成して、そのタイトル部分を編集して
[userDT]というデータセット名を付けてさらに保存します。


「プロジェクト」-「新しい項目の追加」-右側のテンプレートから「Crystalレポート」を選択し

[CrUsers.rpt]というファイル名で保存します。

※2010.8.28時点のVisual Studio 2010 日本語版(以下、VS JP版)とそのダウンロード版Crystal Reportsでは、この時点でレポート名.rptというファイルが出来るはずが、レポート名.mhtというファイルが作られるようです。私はVisual Studio 2010 英語版(以下、VS EN版)で作ったものをVS JP版にインポートしてこの現象を回避していますが、現時点(2010.8.28時点)のCrystal ReportsはBeta2版ということですので、VS JP版をご利用する場合、正式版まで待つしかないようです。



今度はCrUsers.rpt上で右クリックしてDatabase Expertでデータセット選択してレポートにカラムを作成。


「プロジェクト」-「新しいフォームの追加」-右側のテンプレートから「Windows フォーム」を選択し
[FormReportsUser.cs]として保存。保存したレポート表示用のWindowsフォーム[FormReportsUser.cs]へ
Tool Boxより「CrystalReportViewer」をDrug & Dropし、名前を[CrvUsers]とします。

右上に表示される設定用の矢印マークをクリックして開くダイアログのリストボックスで表示用のレポートソースに
[CrUsers.rpt]を選択します。

ここまで出来たら、ソリューションエクスプローラーから
[FormReportsUser.cs]を右クリック - [コードの表示]を選択

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.ReportSource;
using CrystalDecisions.Shared;

namespace PostgreSQLTEst
{
    public partial class FormReportsUser : Form
    {

        // メンバ変数
        // データベース接続子
        private NpgsqlConnection m_conn = new NpgsqlConnection
        (
              "Server=192.168.0.30;"
            + "Port=5432;"
            + "User Id=oira;"
            + "Password=yu2;"
            + "Database=yu2;"
            + "Encoding=UNICODE"
        );

        // sectorのデータアダプタ
        private NpgsqlDataAdapter da = new NpgsqlDataAdapter();

        // データセット
        private DataSet ds = new DataSet();

        public FormReportsUser()
        {
            InitializeComponent();
        }

        private void FormReportsUser_Load(object sender, EventArgs e)
        {

            // usersのデータアダプタ構築
            // selectコマンド
            da.SelectCommand = new NpgsqlCommand
            (
                   "select"
                + " id"
                + ", first_name"
                + ", last_name"
                + ", first_phonetic"
                + ", last_phonetic"
                + ", age"
                + ", g_id"
                + ", postal_code"
                + ", address"
                + ", n_id"
                + ", flg"
                + " from"
                + " users"
                + " order by id",
                m_conn
            );
            // データセット生成
            da.Fill(ds, "usersDT");

            //// Create a CrUsers object 
            CrUsers myReport = new CrUsers();
            //// Set the DataSource of the report 
            myReport.SetDataSource(ds);
            //// Set the Report Source to ReportView 
            CrvUsers.ReportSource = myReport; 

        }

    }
}

ここで、デバッグすると

ファイルまたはアセンブリ 'file:///C:\Program Files\SAP BusinessObjects\SAP
 BusinessObjects Enterprise XI 4.0\win32_x86\dotnet1\crdb_adoplus.dll'、または
その依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

というcrdb_adoplus.dllに纏わるエラーが出てしまいました。
しばらくgoogleで検索していたたところ

ファイル[app.config]に

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.0"/>
  </startup>
</configuration>

と記述すればエラーが回避できるとのことで、
早速、実行してみると無事回避されたようです。
(これがいいのか悪いのか私にはわかりませんが)

デバッグすると無事表示されました。

参考ページ:Crystal Report with PostgreSQL (英語)