0

我将图像路径文件作为文本存储到数据库中,而不是使用 OLE 对象。现在我想知道如何从数据库中检索图像路径并将图像加载到水晶报表中。

图像路径是这样存储的C:\Users\HPLaptop\Desktop\Folder\ImageFile.jpg,我希望水晶报告使用这个路径文件加载图像。

4

1 回答 1

1

报告架构:

我们都知道我们需要为水晶报告提供一个模式。这是我们将为报告提供的报告模式的 XML 视图。

BLOB 字段:

为了将图像添加到水晶报表(考虑到图像字段来自数据库),我们需要在模式中有一个 BLOB 字段。当您想在数据库中存储图像、文档或不同的自定义类型时,您可以使用 BLOB 字段。BLOB 代表二进制大对象。

如果您检查此模式,我们可以看到我们有一个名为“Images”的表和两列“path”和“image”。“图像”列是 Base64 二进制类型。这是我们的 BLOB 字段。我们在程序中要做的是,当用户选择要上传的图像时,我们将该图像作为字节流存储在 BLOB 字段中,然后将该数据集提供给报告。

CreateTable() 方法将说明如何在程序中生成此模式。

为报告生成架构:

还有其他方法可以创建架构,但这会让您更清楚地了解列字段。

创建表:

私人无效创建表()

{

      //create a new data set.

      this.DsImages = new DataSet();

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

数据表 ImageTable = new DataTable("Images");

      //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);

}

如果您注意到“图像”列,您可以看到该列的类型是 System.Byte[]。这很简单。只需创建一个包含两列的表。然后将其添加到数据集。现在您可以使用以下行创建架构:

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

一旦我们准备好模式,我们就可以将它提供给水晶报表。

图 1:

在此处输入图像描述

检查图像 1,在字段资源管理器中,我们可以看到图像表和两列路径和图像。当您将图像列拖到报表上时,您可以看到该字段的类型是 IBlobFieldObject。这些字段将读取字节流并将其转换回图像。这样我们的任务就差不多完成了。下面的代码向您展示了它如何将图像保存为 BLOB 字段中的字节流。

私人无效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 方法来读取字节数组。

博士[“图像”] = BinRed.ReadBytes((int)BinRed.BaseStream.Length);

于 2013-02-09T11:48:46.700 回答