zoukankan      html  css  js  c++  java
  • 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
    
     
  • 相关阅读:
    git取消文件跟踪
    servlet
    查杀端口进程
    初始化git仓库,并push到远端
    tomcat
    bootstrap
    idea中web工程错误
    i++和++i
    js算法
    编程工具
  • 原文地址:https://www.cnblogs.com/shuiguang/p/2653408.html
Copyright © 2011-2022 走看看