0

OLE オブジェクトを使用する代わりに、イメージ パス ファイルをテキストとしてデータベースに保存しました。データベースから画像パスを取得し、Crystal Report に画像をロードする方法を知りたいです。

画像のパスはこのように保存されてC:\Users\HPLaptop\Desktop\Folder\ImageFile.jpgおり、Crystal レポートでこのパス ファイルを使用して画像をロードする必要があります。

4

1 に答える 1

1

レポート スキーマ:

Crystal Repot のスキーマを提供する必要があることは誰もが知っています。レポートに提供するレポート スキーマの XML ビューを次に示します。

BLOB フィールド:

Crystal レポートに画像を追加するには (画像フィールドがデータベースからのものであることを考慮して)、スキーマに BLOB フィールドが必要です。イメージ、ドキュメント、またはさまざまなカスタム タイプをデータベースに保存する場合は、BLOB フィールドを使用します。BLOB は Binary Large Object の略です。

このスキーマを調べると、「Images」というテーブルと、「path」と「image」という 2 つの列があることがわかります。「画像」列は Base64 Binary 型です。これが BLOB フィールドです。プログラムで実行することは、ユーザーがアップロードする画像を選択したときに、その画像を BLOB フィールドにバイト ストリームとして保存し、そのデータセットをレポートに提供することです。

CreateTable() メソッドは、プログラムでこのスキーマを生成する方法を示しています。

レポートのスキーマの生成:

スキーマを作成する方法は他にもありますが、これにより、列フィールドについてより明確なアイデアが得られます。

テーブルの作成:

プライベート ボイド CreateTable()

{

      //create a new data set.

      this.DsImages = new DataSet();

      //create a new table with two columns and add the table to the
  dataset

DataTable ImageTable = new DataTable("画像");

      //in here the "path" column is not really needed. Image column is
  just enough.

ImageTable.Columns.Add(new DataColumn("path",typeof(string)));

      //Important note

      //Note the type of the image column. You want to give this column
  as a blob field to the crystal report.

      //therefore define the column type as System.Byte[]

      ImageTable.Columns.Add(new DataColumn("image",typeof(System.Byte[])));

      this.DsImages.Tables.Add(ImageTable);

}

"image" 列に注目すると、その列の型が System.Byte[] であることがわかります。これはかなり簡単です。2 つの列を持つテーブルを作成するだけです。次に、それをデータセットに追加します。これで、次の行を使用してスキーマを作成できます。

this.DsImages.WriteXmlSchema(@"c:\temp\ImagesSchema.xsd");

スキーマの準備ができたら、Crystal レポートに提供できます。

画像 1:

ここに画像の説明を入力

Image 1 を調べます。フィールド エクスプローラーで、Images テーブルと、パスとイメージの 2 つの列を確認できます。画像列をレポートにドラッグすると、そのフィールドのタイプが IBlobFieldObject であることがわかります。これらのフィールドは、バイト ストリームを読み取り、それを画像に変換します。これで、私たちのタスクはほぼ完了です。以下のコードは、イメージを BLOB フィールドのバイト ストリームとして保存する方法を示しています。

private void openFileDialog1_FileOk(オブジェクト送信者、System.ComponentModel.CancelEventArgs e)

{

      try

      {

               //get the image file into a stream reader.

               FileStream FilStr = new FileStream(this.openFileDialog1.FileName, FileMode.Open);

                BinaryReader BinRed = new BinaryReader(FilStr);

               //Adding the values to the columns

               // adding the image path to the path column

               DataRow dr = this.DsImages.Tables["images"].NewRow();

               dr["path"] = this.openFileDialog1.FileName;

               //Important:

               // Here you use ReadBytes method to add a byte array of the image stream.

               //so the image column will hold a byte array.

               dr["image"] = BinRed.ReadBytes((int)BinRed.BaseStream.Length);

               this.DsImages.Tables["images"].Rows.Add(dr);

               FilStr.Close();

               BinRed.Close();

               //create the report object

               DynamicImageExample DyImg = new DynamicImageExample();

               // feed the dataset to the report.

               DyImg.SetDataSource(this.DsImages);

               this.crystalReportViewer1.ReportSource = DyImg;

      }

      catch(Exception er)

      {

               MessageBox.Show(er.Message,"Error");

      }

}

これは、openFileDialog の FileOk メソッドに記述します。BinaryReader.ReadBytes メソッドを使用して、バイト配列を読み取ります。

dr["画像"] = BinRed.ReadBytes((int)BinRed.BaseStream.Length);

于 2013-02-09T11:48:46.700 に答える