• VS2005在水晶报表中如何显示数据库中保存的是图片路径的图片


    说明:水晶报表显示的图片是固定大小的,无法改变,而且无法显示GIF格式的图片(如果把原来的GIF格式硬性改成了JPG等其他格式,也是无法显示的);此实例讲解的是如果数据库中保存的图片时图片路径的情况,如果数据库中是采用的Binary或者Image类型保存的是图片本身的,就可以直接拖拽到水晶报表即可。

    1、在App_Code文件夹上右键添加新项,选择【数据集】,命名为DataSet1.xsd,如下图:

    2、出现TableAdapter配置向导,点击取消,同时把界面上的DataTable1和DataTable1TableAdapter删除,出现空白界面后,点击“数据集工具箱”

    3、拖入一个DataTable,并改名为你想取的表名,在DataTable上右键添加列,将你想显示在水晶报表中的列全部添入,并设置各列的数据类型,列名不一定跟数据库表中的字段同名,Picture在数据库中是字符串类型,此处要设置为字节数组类型:System.Byte[],这也是能在水晶报表中显示图片的一个关键。

    4、在解决方案中右键,添加新项,选择Crystal报表,如下图:

    4、点击“添加”后,选择使用使用报表向导,如图

    5、按照图示中,进行选择,然后直接点击“完成”

    6、在出现的界面中,左侧选择数据集中的表,将要在报表中显示的字段拖入详细资料即可,可以看到Picture是一个大方框。

    7、最后将完成的CrystalReport.rpt文件拖入到App_Data文件夹中。

    8、新建一个Web窗体,在工具箱的Crystal Reports项中拖入一个CrystalReportViewer控件,ID默认为CrystalReportViewer1,切换到代码视图中,添加如下代码:

    代码

     1 ...
     2 using System.Data.SqlClient;
     3 using CrystalDecisions.Shared;
     4 using CrystalDecisions.CrystalReports.Engine;
     5 using System.IO;
     6 
     7 protected void Page_Load(object sender, EventArgs e)
     8     {
     9         SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["strShop"].ConnectionString);
    10         conn.Open();
    11 
    12         DataSet ds = new DataSet();
    13         DataTable dt = new DataTable("Product");
    14         ds.Tables.Add(dt);
    15         //构建的列信息必须跟创建的DataSet的XSD架构相同
    16         dt.Columns.Add(new DataColumn("ProdID",Type.GetType("System.String")));
    17         dt.Columns.Add(new DataColumn("ProdName",Type.GetType("System.String")));
    18         dt.Columns.Add(new DataColumn("Picture",Type.GetType("System.Byte[]")));
    19         DataRow drow;
    20 
    21         SqlCommand comm = new SqlCommand("select * from Product",conn);
    22         SqlDataReader dr = comm.ExecuteReader(CommandBehavior.CloseConnection);
    23         while(dr.Read())
    24         {
    25             drow = dt.NewRow();
    26             drow["ProdID"= dr["ProdID"].ToString();
    27             drow["ProdName"= dr["ProdName"].ToString();
    28             drow["Picture"= GetImage(dr["Picture"].ToString());
    29             dt.Rows.Add(drow);
    30         }
    31         dr.Close();
    32 
    33         ReportDocument doc = new ReportDocument();
    34         doc.Load(Server.MapPath("~/App_Data/CrystalReport.rpt"));
    35         doc.SetDataSource(ds);
    36         CrystalReportViewer1.ReportSource = doc;
    37     }
    38     private Byte[] GetImage(string FullPath)
    39     {
    40         byte[] byImage = null;
    41         //下面这条语句有时运行正常,有时就提示文件正被另一进程使用,无法访问,啥原因??
    42         FileStream fs = new FileStream(Server.MapPath("~/upfile/prod/"+ FullPath, FileMode.Open);
    43         BinaryReader br = new BinaryReader(fs);
    44         byImage= br.ReadBytes(Convert.ToInt32(br.BaseStream.Length));
    45         fs.Close();
    46         br.Close();
    47         return byImage;
    48     }

    9、运行此页面即可预览报表。

  • 相关阅读:
    STM8s在利用库配置端口的小问题
    ABAP调试
    READ TABLE 的用法
    人在低谷
    力扣 两数之和
    未来选择
    选择
    室友问题该如何解决呢?
    力扣 两数之和
    谈谈自己
  • 原文地址:https://www.cnblogs.com/lavenderzh/p/1621864.html
Copyright © 2020-2023  润新知