复制到数据表时,水晶报告出错

时间:2015-02-26 18:00:07

标签: c# asp.net datatable crystal-reports dataset

我遇到使用水晶报告报告的问题

这是我的代码

protected void Page_Load(object sender, EventArgs e)
    {
        string Judul, Peminjam, Pinjam, Kembali;
        DataTable dtReturn = new DataTable();
        SqlConnection con = data.getKoneksi();
        con.Open();
        SqlCommand Perintah = new SqlCommand();
        Perintah.Connection = con;
        Perintah.CommandText = "SELECT DISTINCT Peminjaman.Katalog, Peminjaman.Pinjam, Peminjaman.Kembali, Pengguna.Nama, Buku.Judul, Buku.Jumlah, Temp.Kembali AS HrsKbl FROM Peminjaman INNER JOIN Buku INNER JOIN Temp ON Buku.ID = Temp.ID ON Peminjaman.Katalog = Buku.ID AND Peminjaman.Katalog = Temp.ID INNER JOIN Pengguna ON Peminjaman.Peminjam = Pengguna.NIS WHERE Peminjaman.Status = 'dipinjam' ORDER BY Kembali ASC";
        SqlDataAdapter Adapter = new SqlDataAdapter();
        Adapter.SelectCommand = Perintah;
        Adapter.Fill(dtReturn);
        LapBulanan.LaporanBulananDataTable dt = new LapBulanan.LaporanBulananDataTable();
        foreach (DataRow dr in dtReturn.Rows)
        {
            Judul = dr["Judul"].ToString();
            Peminjam = dr["Nama"].ToString();
            Pinjam = dr["Pinjam"].ToString();
            Kembali = dr["Kembali"].ToString();
        }

        DataTable dtTemp = dt;
        ReportDocument rpt = new Laporan();
        rpt.Load(Server.MapPath("~/Laporan.rpt"));
        rpt.SetDataSource(dtTemp);
        rpt.SetDataSource(dt.CopyToDataTable());
        CrystalReportViewer1.ReportSource = rpt;
        CrystalReportViewer1.DataBind();
        rpt.ExportToHttpResponse(ExportFormatType.PortableDocFormat, System.Web.HttpContext.Current.Response, false, "Laporan");
        con.Close();
    }

我的数据集名称是LapBulanan.xsd,包含数据名称LaporanBulanan(Judul,Peminjam,Pinjam,Kembali)

当我调试这个程序时,我收到一条错误消息“源包含没有DataRows”,但当我检查此查询时,我得到了正确的记录

当我删除“rpt.SetDataSource(dt.CopyToDataTable());”这个水晶报告运行良好,但我的报告没有记录

谢谢你的善意

1 个答案:

答案 0 :(得分:0)

首先,永远不会使用具有SQL查询结果的dtReturn数据表。相反,您使用的dtTemp数据表不包含任何数据,因为您只是为其分配了dt数据表的空实例。

foreach循环什么都不做,因为它只是为4个变量赋值,这些变量在每次迭代中都会发生变化,之后再也不会被使用。

您不需要两次设置报告的数据源。

所以我认为代码应该看起来像这样

protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dtReturn = new DataTable();
        SqlConnection con = data.getKoneksi();
        con.Open();
        SqlCommand Perintah = new SqlCommand();
        Perintah.Connection = con;
        Perintah.CommandText = "SELECT DISTINCT Peminjaman.Katalog, Peminjaman.Pinjam, Peminjaman.Kembali, Pengguna.Nama, Buku.Judul, Buku.Jumlah, Temp.Kembali AS HrsKbl FROM Peminjaman INNER JOIN Buku INNER JOIN Temp ON Buku.ID = Temp.ID ON Peminjaman.Katalog = Buku.ID AND Peminjaman.Katalog = Temp.ID INNER JOIN Pengguna ON Peminjaman.Peminjam = Pengguna.NIS WHERE Peminjaman.Status = 'dipinjam' ORDER BY Kembali ASC";
        SqlDataAdapter Adapter = new SqlDataAdapter();
        Adapter.SelectCommand = Perintah;
        Adapter.Fill(dtReturn);

        ReportDocument rpt = new Laporan();
        rpt.Load(Server.MapPath("~/Laporan.rpt"));
        rpt.SetDataSource(dtReturn);

        CrystalReportViewer1.ReportSource = rpt;
        CrystalReportViewer1.DataBind();
        rpt.ExportToHttpResponse(ExportFormatType.PortableDocFormat, System.Web.HttpContext.Current.Response, false, "Laporan");
        con.Close();
    }