CrystalReport始终显示相同的数据
本文关键字:数据 显示 CrystalReport | 更新日期: 2023-09-27 18:30:14
我需要用程序显示数据,但我的代码显示的数据总是一样的。即使我更改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();
}
}
您被硬编码
WHERE em.emp_id = 6
请动态传递。调试:首先检查您的可数据数据。
Raihan,
当您使用将数据集馈送到Crystal Report时,最重要的是:
- 您最初构建报告的数据源类型
- 您现在提供的数据集是精确的匹配(相同的列和类型)
如果操作正确,则不需要像在此处那样设置连接信息并将登录信息应用于报告。(你只需要这些东西来构建你的数据集。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"answers"emp_lname"等,则绝对不应将它们别名为"Employee id"、"First Name"answers"Last Name"等。
您的列集合有:
列太少,太多。您需要报表所基于的确切集合。(您可以在Crystal报表设计器中看到这一点。)
列名称不正确。
现在具有不同类型的列。例如,您更改了数据库中的列类型。如果报表尚未更新为使用此新列类型,则如果数据集未传入相同类型的列,则数据集将失败。
终于解决了。。。
我在填充数据集时添加了该表。
da.Fill(ds.Tables[0]);
代替
da.Fill(ds);