rdlc报表中显示数据库中的图片
一、技术来源
根据微软的MSDN上文章《如何添加数据绑定图像 (Reporting Services)》
报表定义可以包括对存储在数据库中的图像的引用。这类图像称为“数据绑定图像”。可以像对任何报表项那样将图像报表项从工具箱拖至设计图面,来向表体添加数据绑定图像。将数据绑定图像添加到页眉或页脚还需要其他步骤。有关详细信息,请参阅添加页眉和页脚。
如果已在 Microsoft Access 中创建或存储图像,则该图像包括防止图像在运行时显示在报表页上的 OLE 标头信息。可以使用下面的第二个过程来删除 OLE 标头。
添加数据绑定图像
-
在“设计”视图中,单击工具箱中的“图像”。
-
在设计图面上,单击该设计图面,然后拖动鼠标根据所需图像的大小创建一个框。此外,也可以单击设计图面以创建固定大小的图像项。
-
在“图像属性”对话框的“名称”文本框中键入名称,或接受默认值。
-
(可选)在“工具提示”文本框中,键入当用户将鼠标悬停在呈现报表中的图像上时所要显示的文本。
-
在“选择图像源”中,选择“数据库”。
-
在“使用此字段”中,选择包含该图像的字段。
-
在“使用此 MIME 类型”中,选择该图像的 MIME 类型。
-
单击“确定”。
在报表设计图面上将出现图像占位符。
从 Access 图像中删除 OLE 标头
-
按以上过程所述,从 Access 数据源中添加图像。
-
在“图像属性”对话框中,单击表达式 (fx) 按钮。
-
在“表达式”对话框中,将以下表达式(不带换行符)复制到表达式窗格中:
=System.Convert.FromBase64String(Mid(System.Convert.ToBase64String(Fields!ImageFieldName.Value),105))
该表达式使用 Mid 排除位于文件前 105 个字符中的标头信息,然后使用 Convert 对图像的其余部分进行 base64 编码。该表达式假设图像是在 EN-US 数据库中产生的。如果您使用的是不同的排序规则,则 OLE 标头可能会比 105 个字符更长或更短。
-
单击“确定”两次。
在报表设计图面上将出现图像占位符。
二、实验:
在使用环境为vs.net 2010,C#.net语言,SQL Server Compact 3.5 sp2上测试成功。
我使用Northwind.sdf数据库作为实验数据库,Employees表中的Photo字段是雇员的头像,直接使用原有的头像怎么也不成功,后来我换成了.jpg文件,实验成功。
以下代码将图片存入数据库
private void button1_Click(object sender, EventArgs e) { Stream memoryStream; Byte[] pictuerByte; if (openFileDialog1.ShowDialog() == DialogResult.OK ) // 选择了一个文件 { if ((memoryStream = openFileDialog1.OpenFile()) != null) { pictuerByte = new Byte[memoryStream.Length]; memoryStream.Position = 0; memoryStream.Read(pictuerByte, 0, Convert.ToInt32(memoryStream.Length));//将二进制数据读取到数组中 //将数据存储到数据库 string updateSqlCommand = "UPDATE Employees SET Photo = @UpdateImage WHERE [Employee ID] = "
+ Convert.ToInt32 (this.employeeIDTextBox .Text); SqlCeParameter parameter = new SqlCeParameter() {
ParameterName = "@UpdateImage", Value = pictuerByte, SqlDbType = SqlDbType.Image }; SqlCeParameter[] Parameter = new SqlCeParameter[1]; Parameter[0] = parameter; SQLServerCompact_SQL_CSharp_Helper updateEmployees = new SQLServerCompact_SQL_CSharp_Helper(); int result = updateEmployees.SQLExecuteNonQuery(Properties.Settings.Default.NorthwindConnectionString,
updateSqlCommand, Parameter); if (result > 0) { //this.photoPictureBox.Image = new Bitmap(memoryStream ); this.employeesTableAdapter.Fill(this.northwindDataSet.Employees);//重新填充数据集 } else { MessageBox.Show("failed"); } memoryStream.Close(); } } }
另外一种将图片存储到数据库表中的方法:用一条sql语句即可搞定。
将 varbinary(max) 列中存储的现有图像替换为新图像。同时使用 OPENROWSET
函数和 BULK
选项将图像加载到列中。此示例假定指定的文件路径中存在名为 Tires.jpg
的文件。
USE AdventureWorks2008R2; GO UPDATE Production.ProductPhoto SET ThumbNailPhoto = ( SELECT * FROM OPENROWSET(BULK 'c:\Tires.jpg', SINGLE_BLOB) AS x ) WHERE ProductPhotoID = 1; GO