从数据库中取出图片二进制流,显示到水晶报表中
mark:关于VS2012(2010)水晶报表的使用可阅读我写的这篇文章:C#中如何使用水晶报表http://blog.csdn.net/qq_22889875/article/details/77017551
阅读了前面的(一)(二)文章,相信都学会了如何将图片二进制流保存到数据库中,现在来学习下如何从数据库中读取二进制流,并将图片成功显示到水晶报表中。
1、从数据库中读取图片二进制流,这里只选取了一条记录(记得添加引用:MySql.Data.dll)。
代码如下:
MySqlConnection conn = new MySqlConnection();
string connString = "Server = localhost;Database = test;Uid = root;Pwd = root1234";
conn.ConnectionString = connString;
conn.Open();
MySqlDataAdapter da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand("select image_path from image_path where id = 1", conn);
MySqlDataReader dr = cmd.ExecuteReader();
byte[] imagebytes = null;
while (dr.Read())
{
imagebytes = (byte[])dr.GetValue(0);
}
2、用二进制流显示图片到水晶报表中,可利用DataSet为中介,先将取出的二进制流保存到DataSet中,然后在水晶报表中添加DataSet中的图片元素。
操作步骤如下:
1)在项目名称上右键->添加->新建项->数据->数据集,如下图所示:
成功生成xsd文件:
双击该xsd文件,在界面中右键->添加数据表,然后在表中右键->添加->列,给列命名为pic1,点击该变量,右键->属性,修改其类型为System.Byte[],对应水晶报表中字段类型Blob,保存;
2)在项目名称上右键->添加->新建项,新建一个空白水晶报表CrystalReport1.rpt,如图:
双击该rpt文件,在打开界面空白处右键->数据库->数据库专家,选择如下图:
点击选择文件路径后的三个点,选中之前新建的xsd文件,如图:
点击完成,选择DataTable1,点击“>”,如图,确定,将之前新建的DataSet1表添加到水晶报表中
选中新建的表DataTable1,打开水晶报表的字段资源管理器,如图:
用鼠标将数据库字段pic1拖到水晶报表空白处(位置根据自己需求定,可随意拖动),效果如图:
同时,也可在水晶报表中添加参数字段,我这里加了个name字段,将name字段拖到图片下方,用来给图片命名
如图:
到此,Dataset成功添加到水晶报表中。
3)双击Form1.cs,在打开的Form1界面中,选择工具箱中的水晶报表选项,插入一个水晶报表,右键->选择crystal报表,如图:
将建好的CrystalReport1.rpt添加到Form1.cs中
4)编写代码:
Form1.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Data;
using MySql.Data.MySqlClient;
namespace imageToCReport
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
MySqlConnection conn = new MySqlConnection();
string connString = "Server = localhost;Database = test;Uid = root;Pwd = root1234";
conn.ConnectionString = connString;
conn.Open();
MySqlDataAdapter da = new MySqlDataAdapter();
MySqlCommand cmd = new MySqlCommand("select image_path from image_path where id = 1", conn);
MySqlDataReader dr = cmd.ExecuteReader();
byte[] imagebytes = null;
while (dr.Read())
{
imagebytes = (byte[])dr.GetValue(0);
}
imageToCR(imagebytes);
}
public void imageToCR(byte[] imagebytes )
{
DataSet1 d = new DataSet1();
DataRow r = d.Tables["dataTable1"].NewRow();
r[0] = imagebytes ;
d.Tables["dataTable1"].Rows.Add(r); //将图片1二进制流加入到DataSet中的表dataTable1中
CrystalReport1 cr = new CrystalReport1();
cr.SetDataSource(d);
cr.SetParameterValue("name","阿狸"); //给图片命名
crystalReportViewer1.ReportSource = cr;
}
}
}
5)运行代码,会报异常,如图:
双击App.config,在标签startup中设置属性,useLegacyV2RuntimeActivationPolicy=”true”,如图:
运行程序,成功显示图片,结果如图: