OLE オブジェクトを使用する代わりに、イメージ パス ファイルをテキストとしてデータベースに保存しました。データベースから画像パスを取得し、Crystal Report に画像をロードする方法を知りたいです。
画像のパスはこのように保存されてC:\Users\HPLaptop\Desktop\Folder\ImageFile.jpg
おり、Crystal レポートでこのパス ファイルを使用して画像をロードする必要があります。
OLE オブジェクトを使用する代わりに、イメージ パス ファイルをテキストとしてデータベースに保存しました。データベースから画像パスを取得し、Crystal Report に画像をロードする方法を知りたいです。
画像のパスはこのように保存されてC:\Users\HPLaptop\Desktop\Folder\ImageFile.jpg
おり、Crystal レポートでこのパス ファイルを使用して画像をロードする必要があります。
レポート スキーマ:
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);