0

我需要以编程方式显示数据,但我的代码总是显示相同的数据。即使我更改 WHERE em.emp_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();
    }
}
4

3 回答 3

0

终于解决了……

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

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

代替

da.Fill(ds);
于 2012-04-09T05:16:51.223 回答
0

你是硬编码的

 WHERE em.emp_id = 6

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

于 2012-04-07T09:50:52.597 回答
0

赖汉,

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

  1. 您最初从什么类型的数据源构建报告
  2. 您现在提供的数据集是完全匹配的(相同的列和类型)

如果这样做正确,您不需要像在此处那样设置连接信息并将登录信息应用到报告中。(您只需要这些东西来构建您的数据集。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。不要尝试通过向报告传递服务器名称等来解决问题。尝试修复 DataSet。

您正在为数据集的 select 语句中为列创建别名。水晶报表是这样的吗?如果 Crystal Reports 中的字段被命名为 'emp_id'、'emp_fname' 和 'emp_lname' 等,那么绝对不能将它们别名为 'Employee ID'、'First Name' 和 'Last Name' 等。

您的列集合有:

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

  2. 命名错误的列。

  3. 现在具有不同类型的列。例如,您更改了数据库中的列类型。如果报表尚未更新为使用这种新的列类型,那么如果您的数据集未传入相同类型的列,则它将会失败。

于 2012-04-07T09:57:23.240 回答