如何在数据集中使用2个sql请求和2个数据表在水晶报表中显示数据?

时间:2015-04-22 12:19:46

标签: c# winforms c#-4.0 crystal-reports crystal-reports-2008

我有一个带有2个数据表的数据集aand我需要使用2个sql请求来显示crystal report中的数据。所以我在我的数据集中创建了2个数据表(DataTable1和dataTable2)我尝试了这个代码,但它总是执行第二个sql请求!!

con.ConnectionString = @"connection";

string sql = "MyRequest1";
string sql1 = "MyRequest2";

DataSet1 ds = new DataSet1();  

SqlDataAdapter dad = new SqlDataAdapter(sql, con);
SqlDataAdapter dad1 = new SqlDataAdapter(sql1, con);

dad.Fill(ds.Tables["DataTable1"]);
dad1.Fill(ds.Tables["DataTable2"]);

CrystalReport1 report = new CrystalReport1();

report.SetDataSource(ds.Tables["DataTable2"]);
report.SetDataSource(ds.Tables["DataTable1"]);

crystalReportViewer1.ReportSource = report;

crystalReportViewer1.Refresh();

2 个答案:

答案 0 :(得分:0)

您需要将数据表合并为一个并设置它们。每次使用数据表调用SetDataSource时,都会覆盖以前的数据。

使用Merge()功能实现此目的 -

DataTable dt = ds.Tables["DataTable2"];
DataTable dt2 = ds.Tables["DataTable1"];
dt.Merge(dt2);
report.SetDataSource(dt);

答案 1 :(得分:0)

解决方案是为数据集中使用的每个DataTable实现数据表方法:第一个数据表的示例:

protected DataTable DataTable1()
    {
        string sql = "MyRequest";
        SqlDataAdapter dad = new SqlDataAdapter(sql, con);
        DataSet1 ds = new DataSet1();
        dad.Fill(ds.Tables["NameOfDataTable"]);
        DataTable dt = ds.Tables["NameOfDataTable"];
        return dt;

    }

并在打印按钮中添加以下代码:

try {
            DataSet ds = new DataSet();
            DataTable dt1 = DataTable1().Copy(); //the name of the method
            ds.Tables.Add(dt1);
            CrystalReport1 myreport = new CrystalReport1();
            myreport.SetDataSource(ds);
            crystalReportViewer1.ReportSource = myreport;

}
catch (Exception ex)
{
   //code ...
}

它成功运作:)