rdlc报表中显示数据库中的图片

一、技术来源

      根据微软的MSDN上文章《如何添加数据绑定图像 (Reporting Services)》

报表定义可以包括对存储在数据库中的图像的引用。这类图像称为“数据绑定图像”。可以像对任何报表项那样将图像报表项从工具箱拖至设计图面,来向表体添加数据绑定图像。将数据绑定图像添加到页眉或页脚还需要其他步骤。有关详细信息,请参阅添加页眉和页脚

如果已在 Microsoft Access 中创建或存储图像,则该图像包括防止图像在运行时显示在报表页上的 OLE 标头信息。可以使用下面的第二个过程来删除 OLE 标头。

添加数据绑定图像

  1. 在“设计”视图中,单击工具箱中的“图像”

  2. 在设计图面上,单击该设计图面,然后拖动鼠标根据所需图像的大小创建一个框。此外,也可以单击设计图面以创建固定大小的图像项。

  3. “图像属性”对话框的“名称”文本框中键入名称,或接受默认值。

  4. (可选)在“工具提示”文本框中,键入当用户将鼠标悬停在呈现报表中的图像上时所要显示的文本。

  5. “选择图像源”中,选择“数据库”

  6. “使用此字段”中,选择包含该图像的字段。

  7. “使用此 MIME 类型”中,选择该图像的 MIME 类型。

  8. 单击“确定”。

    在报表设计图面上将出现图像占位符。

从 Access 图像中删除 OLE 标头

  1. 按以上过程所述,从 Access 数据源中添加图像。

  2. “图像属性”对话框中,单击表达式 (fx) 按钮。

  3. 在“表达式”对话框中,将以下表达式(不带换行符)复制到表达式窗格中:

    =System.Convert.FromBase64String(Mid(System.Convert.ToBase64String(Fields!ImageFieldName.Value),105))

    该表达式使用 Mid 排除位于文件前 105 个字符中的标头信息,然后使用 Convert 对图像的其余部分进行 base64 编码。该表达式假设图像是在 EN-US 数据库中产生的。如果您使用的是不同的排序规则,则 OLE 标头可能会比 105 个字符更长或更短。

  4. 单击“确定”两次。

    在报表设计图面上将出现图像占位符。

二、实验:

      在使用环境为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
 

 

posted on 2012-08-23 22:49  水光  阅读(1987)  评论(0编辑  收藏  举报

导航