Crystal Report始终显示相同的数据

时间:2012-04-07 09:48:59

标签: c# crystal-reports

我需要以编程方式显示数据,但我的代码显示数据始终相同。即使我改变了WHERE i'm_mp_id = 5或6

private void Form1_Load(object sender, EventArgs e)
{
    try
    {
        SqlConnection c = frmMain.connect();

        rptEmpProf cryRpt = new rptEmpProf();
        TableLogOnInfos crtableLogoninfos = new TableLogOnInfos();
        TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
        ConnectionInfo crConnectionInfo = new ConnectionInfo();
        Tables CrTables ;
        crConnectionInfo.ServerName = frmMain.dbSrvrName;
        crConnectionInfo.DatabaseName = frmMain.dbName;
        crConnectionInfo.UserID = frmMain.dbUsrName;
        crConnectionInfo.Password = frmMain.dbPass;
        CrTables = cryRpt.Database.Tables ;
        foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
        {
            crtableLogoninfo = CrTable.LogOnInfo;
            crtableLogoninfo.ConnectionInfo = crConnectionInfo;
            CrTable.ApplyLogOnInfo(crtableLogoninfo);
        }

        string q = "SELECT em.emp_id 'Employee ID', " +
            "em.emp_fname 'First Name', " +
            "em.emp_lname 'Last Name', " +
            "em.emp_phone 'Phone', " +
            "em.emp_email 'Email', " +
            "em.emp_addr 'Address', " +
            "em.emp_join_dt 'Join Date', " +
            "em.emp_salary 'Salary'," +
            "em.emp_card_no 'Card No.', " +
            "ds.dsg_name 'Designation', " +
            "dp.dept_name 'Department', " +
            "sf.sft_name 'Shift', " +
            "sc.sec_name 'Section' " +
        "FROM employee em INNER JOIN designations ds ON ds.dsg_id=em.emp_dsg_id " +
            "INNER JOIN sections sc ON sc.sec_id = ds.dsg_sec_id " +
            "INNER JOIN departments dp ON dp.dept_id = sc.sec_dept_id " +
            "INNER JOIN shifts sf ON sf.sft_id = em.emp_sft_id " +
        "WHERE em.emp_id = 6;";

        SqlCommand cmd = new SqlCommand(q, c);
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = cmd;
        DataSet ds = new DataSet();
        da.Fill(ds);
        cryRpt.SetDataSource(ds);
        crystalReportViewer1.ReportSource = cryRpt;
        crystalReportViewer1.Refresh();

        frmMain.disconnect(c);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
        this.Close();
    }
}

3 个答案:

答案 0 :(得分:0)

你是硬编码的

 WHERE em.emp_id = 6

请动态传递。 调试:首先检查您的数据数据。

答案 1 :(得分:0)

Raihan,

当您使用DataSet向Crystal Report提供时,最重要的事情是:

  1. 您最初从
  2. 构建报告的数据源类型
  3. 您现在提供的数据集是完全匹配(相同的列) 和类型)
  4. 如果这样做正确,您不需要像在此处一样设置连接信息并将登录信息应用于报告。 (你只需要那些东西来构建你的数据集.Crystal Reports不关心,因为它只需要那些数据,为什么它会在你给它已经查询过的数据时关心服务器/数据库/密码?)

    以下是某人从XML数据源构建报表,然后传递数据的示例: http://www.crystalreportsbook.com/Forum/forum_posts.asp?TID=9

    你会发现它比你的副本简单得多。事实上,我认为您继续看到相同数据的原因是因为它连接到您的表登录信息指定的服务器等,并使用用于构建报告的默认查询。您的数据集将被忽略。

    Raihan,首先删除此代码。这样做会发生什么?

    TableLogOnInfos crtableLogoninfos = new TableLogOnInfos();
    TableLogOnInfo crtableLogoninfo = new TableLogOnInfo();
    ConnectionInfo crConnectionInfo = new ConnectionInfo();
    Tables CrTables;
    
    crConnectionInfo.ServerName = frmMain.dbSrvrName;
    crConnectionInfo.DatabaseName = frmMain.dbName;
    crConnectionInfo.UserID = frmMain.dbUsrName;
    crConnectionInfo.Password = frmMain.dbPass;
    CrTables = cryRpt.Database.Tables;
    foreach (CrystalDecisions.CrystalReports.Engine.Table CrTable in CrTables)
    {
    crtableLogoninfo = CrTable.LogOnInfo;
    crtableLogoninfo.ConnectionInfo = crConnectionInfo;
    CrTable.ApplyLogOnInfo(crtableLogoninfo);
    }
    

    Raihan,在完成我上面写的内容之后,如果它现在提示你这意味着它不喜欢你的DataSet。不要尝试通过将报告传递给服务器名称等来解决问题。尝试修改数据集。

    您正在数据集的select语句中创建列的别名。水晶报告是怎么回事?如果Crystal Reports中的字段名为“emp_id”,“emp_fname”和“emp_lname”等,那么您绝对不能将它们别名为“员工ID”,“名字”和“姓氏”等。

    您的列集合包含:

    1. 太少,列太多了。您需要构建报告的确切集合。 (您可以在Crystal Report设计器中看到这一点。)

    2. 命名不佳的专栏。

    3. 现在有不同类型的列。例如,您更改了数据库中的列类型。如果未更新报告以使用此新列类型,则如果数据集未传递相同类型的列,则数据集将失败。

答案 2 :(得分:0)

最后它解决了......

我在填充数据集时添加了表格。

da.Fill(ds.Tables[0]);

而不是

da.Fill(ds);