如何将Crystal Report与EF CodeFirst dbContext连接到Mvc.Net

时间:2017-04-17 16:15:29

标签: entity-framework asp.net-mvc-4 crystal-reports ef-code-first repository-pattern

我希望Crystal Report连接到我的应用程序,但当我使用 EF Code First 方法和存储库模式时,我遇到的问题就出现了。我不明白如何将我的 Crystal Report Connection 与我的DBContext连接,在Crystal Report Connection Viewer中我无法看到我的DbContext。我看到的大多数帮助都指向我创建数据集,即 .XSD文件,但所有DataSet都已经可用于DbContext。这是否可能,如果是,那么任何1指导我以下是我的错误

    Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))
string reportPath = Path.Combine(reportFolder, rpt);
             ReportDocument.Load(reportPath);
             ReportDocument.Database.Tables[0].SetDataSource(companies); //Line 29 this where i am getting error
Line 30: //            ReportDocument.SetDataSource(companies);
             await Task.Delay(10);

现在错误显而易见我没有创建连接,因为我正在使用 DBcontext ,我认为这是从所有连接相关细节的地方。据我所知,我的DbContext应该可用整个申请。如果我不去 Dbcontext ,我必须重新创建连接,这有点否定整个分层概念。

这就是我在我的回购中使用水晶报告的方式,

namespace RPS.Reporting
{
    public sealed class ReportGenerator
    {
        private ReportDocument ReportDocument { get; set; }
        public ReportGenerator()
        {
            ReportDocument = new ReportDocument();
        }

        public async Task<Stream> GetCompaniesReport(IEnumerable<Company> companies)
        {
            string rpt = "VoucherSummary.rpt";
            //            string reportFolder = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
            string reportFolder = AppDomain.CurrentDomain.BaseDirectory.Replace("WebApp", "Reporting")+ "Accounting";
            string reportPath = Path.Combine(reportFolder, rpt);
            ReportDocument.Load(reportPath);
            ReportDocument.Database.Tables[0].SetDataSource(companies);
//            ReportDocument.SetDataSource(companies);
            await Task.Delay(10);
            Stream stream = ReportDocument.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
            stream.Seek(0, SeekOrigin.Begin);
            return stream;
        }
    }
}

这是我的控制者。

 public class HomeController : Controller
    {
        private readonly ICompanyService _companyService;

        public HomeController(CompanyService companyService)
        {
            _companyService = companyService;
        }

        .........
        public async Task<ActionResult> ExportCompanies()
        {
            Response.Buffer = false;
            Response.ClearContent();
            Response.ClearHeaders();
            ReportGenerator reportGenerator = new ReportGenerator();
//            string rptPath = Path.Combine(System.Web.HttpContext.Current.Server.MapPath("~"));
            Stream stream = await reportGenerator.GetCompaniesReport(_companyService.GetCompanies());
            return File(stream, "application/pdf", "Companies.pdf");
        }

    }

0 个答案:

没有答案