Pada artikel ini saya akan membahas bagaimana caranya untuk menampilkan dynamic image pada crystal report dengan ASP.NET. Pada program yang saya buat, file gambar saya simpan pada folder di web servernya dengan pertimbangan performance, jika disimpan di database maka performance akan berkurang karena record dalam database menjadi besar, maka saya menyimpan datanya pada folder kemudian menyimpan nama filenya di database.
Adapun design database yang dibuat:
Data gambar disimpan pada folder secimages
Kemudian untuk mengambil data dari database untuk ditampilkan pada crystal report saya menggunakan cara menampungnya dulu kedalam object dataset karena jika mengambil langsung dari database akan menyulitkan jika aplikasi dipindah ke komp server lain (harus merubah computer name pada program).
Maka buat datasetnya dulu untuk datasource pada crystal report
Tambahkan satu field baru pada dataset section yaitu image_stream untuk menampung gambar yang akan kita tampilkan kedalam crystal report, kemudian ubah property DataType pada field image_stream menjadi System.Byte[];
Kemudian pada halaman report-nya (halaman yang ada komponen CrystalReportSource dan CrystalReportViewer) tambahkan kode sebagai berikut:
Web App (ASP.NET)
using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.HtmlControls; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Xml.Linq; using System.IO; public partial class operator_ReportSection : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //menambahkan data kedalam dataset dsReportSection ds = new dsReportSection(); using (DbClass objDb = new DbClass()) { objDb.SQL = "select * from section"; objDb.OpenConnection(); objDb.FillDataSet(ds,"section"); } //ambil image dari folder ~/secimages/ masukan dalam fileds image_stream pada dataset for (int index = 0; index < ds.Tables[0].Rows.Count; index++) { if (ds.Tables[0].Rows[index]["url_gambar"].ToString() != "") { if (File.Exists(Server.MapPath("~/secimages/") + ds.Tables[0].Rows[index]["url_gambar"].ToString())) { LoadImage(ds.Tables[0].Rows[index], "image_stream", Server.MapPath("~/secimages/") + ds.Tables[0].Rows[index]["url_gambar"].ToString()); } } } //tampilkan dalam crystal report crsSection.ReportDocument.SetDataSource(ds.Tables[0]); crvSection.ReportSource = crsSection; } //ambil image pada folder ~/secimages/ private void LoadImage(DataRow objDataRow, string strImageField, string FilePath) { try { FileStream fs = new FileStream(FilePath, System.IO.FileMode.Open, System.IO.FileAccess.Read); byte[] Image = new byte[fs.Length]; fs.Read(Image, 0, Convert.ToInt32(fs.Length)); fs.Close(); objDataRow[strImageField] = Image; } catch (Exception ex) { Response.Write("<font color=red>" + ex.Message + "</font>"); } } }
Contoh Hasil jadinya :
Windows Form App (VB)
Pada win form caranya sama dengan Web, hanya pada kode program ini saya menerapkannya pada kasus yang berbeda yaitu untuk mencetak photo mahasiswa
Imports System.Data Imports System.Data.SqlClient Imports System.Configuration Imports System.IO Public Class FormReportCustomer Private objConn As SqlConnection Private objCmd As SqlCommand Private objDa As SqlDataAdapter Private objDs As dsCustomer Private Sub FormReportCustomer_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load 'buat koneksi Dim strConn As String = ConfigurationManager.ConnectionStrings( _ "ActConnectionString").ConnectionString objConn = New SqlConnection(strConn) Dim strSql As String = "select * from pelanggan" objCmd = New SqlCommand(strSql, objConn) objDa = New SqlDataAdapter() objDs = New dsCustomer() Try objConn.Open() objDa.SelectCommand = objCmd objDa.Fill(objDs, "pelanggan") Catch ex As Exception MessageBox.Show(ex.Message) Finally objCmd.Dispose() objConn.Close() End Try Dim strPath As String = My.Application.Info.DirectoryPath strPath = Path.Combine(strPath, "photo") If objDs.Tables("pelanggan").Rows.Count <> 0 Then For index As Integer = 0 To objDs.Tables(0).Rows.Count - 1 If objDs.Tables(0).Rows(index)("picname").ToString() <> "" Then If File.Exists(Path.Combine(strPath, _ objDs.Tables(0).Rows(index)("picname").ToString())) Then LoadImage(objDs.Tables(0).Rows(index), "image_stream", _ Path.Combine(strPath, _ objDs.Tables(0).Rows(index)("picname").ToString())) End If End If Next rptCustomer1.SetDataSource(objDs.Tables("pelanggan")) CrystalReportViewer1.ReportSource = rptCustomer1 End If End Sub Private Sub LoadImage(ByVal objDataRow As DataRow, _ ByVal strImageField As String, ByVal FilePath As String) Try Dim fs As FileStream = New FileStream(FilePath, _ System.IO.FileMode.Open, System.IO.FileAccess.Read) Dim Image(fs.Length) As Byte fs.Read(Image, 0, CInt(fs.Length)) fs.Close() objDataRow(strImageField) = Image Catch ex As Exception MessageBox.Show(ex.Message) End Try End Sub End Class
Contoh hasil jadinya:
Semoga artikel ini bisa membantu 🙂
Salam
Erick Kurniawan