crystal 报告复制到数据表时出错

crystal report got error when copy to datatable

我在使用 crystal 报告

进行报告时遇到了问题

这是我的代码

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)

当我调试这个程序时,我得到了一条错误消息 "The source contains no DataRows" 但是当我检查这个查询时,我得到了正确的记录

当我删除 "rpt.SetDataSource(dt.CopyToDataTable());" 这个 crystal 报告时 运行 很好,但我的报告没有记录

谢谢你的好意

首先,包含 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();
    }