Shihan Khan
Shihan Khan

Reputation: 2188

DataSource object is invalid in Crystal Report

I'm using asp.net mvc 4 and Crystal Report to make a receipt where datas are stored in MSSQL db and user can download the receipt as pdf file. For some reason, everytime I try to download, I get an error,

CrystalDecisions.CrystalReports.Engine.DataSourceException: The data source object is invalid.

Here are the codes,

    public ActionResult ExtractReceipt()
    {
        var getOwner = rentdb.OwnerRegs.Where(a => a.username == User.Identity.Name).FirstOrDefault();
        var getId = getOwner.serial;

        ReportDocument rd = new ReportDocument();
        rd.Load(Path.Combine(Server.MapPath("~/Reports/Invoice.rpt")));
        rd.SetDataSource(rentdb.Invoices.Where(a => a.owner_id == getId).FirstOrDefault());
        Response.Buffer = false;
        Response.ClearContent();
        Response.ClearHeaders();
        Stream stream = rd.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
        stream.Seek(0, SeekOrigin.Begin);
        return File(stream, "application/pdf", "MyReceipt.pdf");
    }

Is there anything wrong in my code? How can I solve this issue? Thanks.

Upvotes: 1

Views: 2752

Answers (2)

Anand Senma
Anand Senma

Reputation: 1

You Need To Change FirstOrDefault() to ToList();

public ActionResult ExtractReceipt()
{
    var getOwner = rentdb.OwnerRegs.Where(a => a.username == 
    User.Identity.Name).FirstOrDefault();
    var getId = getOwner.serial;

    ReportDocument rd = new ReportDocument();
    rd.Load(Path.Combine(Server.MapPath("~/Reports/Invoice.rpt")));
    rd.SetDataSource(rentdb.Invoices.Where(a => a.owner_id == getId).ToList()); //FirstOrDefault() Need To Change
    Response.Buffer = false;
    Response.ClearContent();
    Response.ClearHeaders();
    Stream stream = rd.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
    stream.Seek(0, SeekOrigin.Begin);
    return File(stream, "application/pdf", "MyReceipt.pdf");
}

Upvotes: 0

Sain Pradeep
Sain Pradeep

Reputation: 3125

Please try this

 var query=rentdb.Invoices.Where(a => a.owner_id == getId).FirstOrDefault();

 var querylist = new List<Invoices> { query };

 rd.SetDataSource(querylist);

Upvotes: 3

Related Questions