C# 如何在两个日期之间创建水晶报表

C# 如何在两个日期之间创建水晶报表,c#,sql-server,sql-server-2008,crystal-reports,C#,Sql Server,Sql Server 2008,Crystal Reports,我尝试使用下面的代码,但它不起作用 我使用SQL查询将报表数据存储在ReportDataSet中。后来我将这个ReportDataSet设置为CrystalReport对象的DataSource private void btnGenReport_Click(object sender, EventArgs e) { CrystalReport1 objRpt = new CrystalReport1(); string sql; //creating

我尝试使用下面的代码,但它不起作用

我使用SQL查询将报表数据存储在
ReportDataSet
中。后来我将这个
ReportDataSet
设置为
CrystalReport
对象的
DataSource

private void btnGenReport_Click(object sender, EventArgs e)
    {
        CrystalReport1 objRpt = new CrystalReport1();

        string sql; //creating sql query
        sql = "SELECT invoice.InvoiceNo, invoice.Date, invoiceitems.Name, invoice.InvoiceTo, invoice.CusName, invoiceitems.Qty, invoiceitems.Rate, invoiceitems.Amount ";
        sql += "FROM (invoice INNER JOIN invoiceitems ON invoice.Date = invoiceitems.Date) ";
        sql += "WHERE (invoice.Date BETWEEN '" + DateTimePickerFrom.Value + "' AND '" + DateTimePickerTo.Value + "');";

        ReportDataSet ds = new ReportDataSet();
            string path = Application.StartupPath + "\\";
        string conStr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=" + path + "SMS_DB.mdf;Integrated Security=True;User Instance=True";
        SqlConnection con = new SqlConnection(conStr); // create connection
        try
        {
            con.Open();
            SqlDataAdapter da = new SqlDataAdapter(sql, con);
            da.Fill(ds, "InvoiceItemData");
            objRpt.SetDataSource(ds.Tables["InvoiceItemData"]);
            crystalReportViewer1.ReportSource = objRpt;
            con.close();
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error ! \n" + ex.ToString());
        }
    }

我将假设一些事情:

  • 您的项目正在使用Visual Studio 2010、.NET Framework 4和Crystal Reports runtime for VS2010
  • 通过与数据库文件SMS_DB.mdf的连接,使用VS的数据集设计器设置类型化数据集
    ReportDataSet
    ,并且此文件中已存在数据
  • 在报表设计器中设置类型化Crystal报表
    rt1
    ,数据源为项目中类型化数据集
    ReportDataSet
    中的表
    InvoiceItemData
  • 所有这些控件都在同一个窗体上
  • 您仍在安装了.NET Framework 4和Crystal Reports runtime for VS2010的计算机上调试此功能
  • 换句话说,我假设您已经设置好了所有内容,在最新的非测试版环境中,您已经完成了
    btnReportGen
    按钮单击之前的所有操作,并且您没有尝试在另一台机器上运行此版本

    现在,我有一些建议和澄清要向你们提出

  • 在本例中,您没有使用类型化数据集作为报表数据源:数据集是您的数据服务,数据源是您的类型化数据表,这就是为什么您在代码中正确地将更新后的数据表发送给报表的原因
  • 为选择器控件和报表查看器使用单独的winforms,并在点击“生成”按钮时从选择器控件窗体调用报表查看器窗体。否则,您将遇到向报表查看器发送坏数据的问题,这将生成不正确的报表或根本没有报表
  • 在报告文档中使用参数,并将选择器控制值发送到报告文档,以便您可以在报告中显示它们,以便用户在点击“生成”按钮时知道它们至少发送了正确的值
  • 在将控件值发送到查看器窗体并在查询中使用它们之前,请检查控件值是否有效。需要检查的事项:它们都设置好了吗?他们都是约会对象吗?To值是否大于或等于From值?该范围对您的数据库有效吗?(这也让您可以选择向用户显示更有用的错误消息,并能够将它们发送回正确的控件,以便用户能够修复。)
  • 由于您已经在使用类型化数据集和数据集设计器,请使用提供的类型化表适配器,在设计器中创建带有参数的自定义查询,然后使用该查询填充表。这将为您省去许多因试图以编程方式完成所有工作而引起的头痛。你有可用的工具,所以使用它们

  • 如果你考虑所有这些,我想你会发现自己的项目是正确的。然而,如果你仍然被困在这里,我可以浏览每个建议,并用截图和示例代码帮助你解决所有问题。如果你需要我做这件事,那没关系,因为我在VS2010中创建了大量Crystal Report项目,我只是根据经验告诉你,作为程序员和用户,什么最适合你。您可能认为通过以编程方式键入所有内容并将其扔到报表查看器中可以节省时间和资源,但这也是它不合作的原因。

    我将假设以下几点:

  • 您的项目正在使用Visual Studio 2010、.NET Framework 4和Crystal Reports runtime for VS2010
  • 通过与数据库文件SMS_DB.mdf的连接,使用VS的数据集设计器设置类型化数据集
    ReportDataSet
    ,并且此文件中已存在数据
  • 在报表设计器中设置类型化Crystal报表
    rt1
    ,数据源为项目中类型化数据集
    ReportDataSet
    中的表
    InvoiceItemData
  • 所有这些控件都在同一个窗体上
  • 您仍在安装了.NET Framework 4和Crystal Reports runtime for VS2010的计算机上调试此功能
  • 换句话说,我假设您已经设置好了所有内容,在最新的非测试版环境中,您已经完成了
    btnReportGen
    按钮单击之前的所有操作,并且您没有尝试在另一台机器上运行此版本

    现在,我有一些建议和澄清要向你们提出

  • 在本例中,您没有使用类型化数据集作为报表数据源:数据集是您的数据服务,数据源是您的类型化数据表,这就是为什么您在代码中正确地将更新后的数据表发送给报表的原因
  • 为选择器控件和报表查看器使用单独的winforms,并在点击“生成”按钮时从选择器控件窗体调用报表查看器窗体。否则,您将遇到向报表查看器发送坏数据的问题,这将生成不正确的报表或根本没有报表
  • 在报告文档中使用参数,并将选择器控制值发送到报告文档,以便您可以在报告中显示它们,以便用户在点击“生成”按钮时知道它们至少发送了正确的值
  • 在将控件值发送到查看器窗体并在查询中使用它们之前,请检查控件值是否有效。需要检查的事项:它们都设置好了吗?他们都是约会对象吗?To值是否大于或等于From值?该范围对您的数据库有效吗?(这也让您可以选择向用户显示更有用的错误消息,并能够将其发送回正确的控件,以便用户能够