CrystalReport始终显示相同的数据
我需要以编程方式显示数据,但我的代码显示的数据总是相同的。同样,即使我改变WHERE em.emp_id = 5或6CrystalReport始终显示相同的数据
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();
}
}
Raihan,
当您使用喂养的DataSet水晶报表中最重要的事情是:
- 您最初建什么类型的数据源来自
- 报告中指出,数据集你现在喂养它是一个精确匹配(相同列 和类型)
如果这样做是正确的,您不需要设置连接信息并像在这里一样将登录信息应用于报告。 (你只需要这些东西来建立你的数据集,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'等,那么您绝对不应将它们别名为'员工ID','名字'和'姓氏'等。
您的色谱柱收集有:
太少,太多列。你需要建立在报告的基础上。 (您可以在Crystal Report设计器中看到此内容。)
命名错误的列。
现在不同类型的列。例如,您更改了数据库中的列类型。如果报告未更新为使用此新列类型,那么如果数据集未通过相同类型的列,则数据集将失败。
最后也就迎刃而解了......
我添加表却使数据集。
da.Fill(ds.Tables[0]);
而不是
da.Fill(ds);
是否真的数据时,不同的雇员5或6?你可以仔细检查一下吗? – sarwar026 2012-04-07 10:08:43