【问题标题】:Report showing raw data instead of data from linq query?报告显示原始数据而不是来自 linq 查询的数据?
【发布时间】:2012-08-28 16:01:48
【问题描述】:

我的报告不断显示我认为报告中员工字段中姓名的原始数据。 sql 表具有正确的数据,但报告从来没有正确的名称。它始终显示 pk 为零的员工,而不是加入的员工。我想我正在显示来自expenseHdrs 和expenseDtls 字段的正确数据,因为它在报告中看起来正确但是当我在调试时将鼠标悬停在查询上时,我看到的只是费用详细信息(我的报告中的行项目)但是我是 Visual Studio 的新手。

基本上,我的查询和我的数据源之间似乎存在脱节,或者我的联接有问题。这是我从数据源获得的 sql 选择,下面是查询。任何帮助将不胜感激。

SELECT DISTINCT expenseHdr.rptNo,expenseHdr.description,expenseHdr.purpose,
expenseHdr.reimbursement, expenseHdr.department, expenseHdr.period, 
expenseDtl.expDesc, expenseDtl.expType, expenseDtl.expCost, 
expenseDtl.expDate, employees.name, expenseDtl.expNo,   
expenseDtl.location
FROM   (Intranet.dbo.expenseHdr expenseHdr INNER JOIN
Intranet.dbo.expenseDtl expenseDtl ON 
expenseHdr.rptNo=expenseDtl.rptNo) INNER JOIN Intranet.dbo.employees 
employees ON expenseHdr.empPk=employees.pk
ORDER BY expenseDtl.expNo
private void launchReport(int pKReport)
{
    using (DataClasses1DataContext db = new DataClasses1DataContext())
    {
        var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         where s.rptNo == pKReport
                         join g in db.employees on s.empPk equals g.pk
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

        expenseReportMain cr1 = new expenseReportMain();

        cr1.FileName = @"\\SRV-NAS\Intranet\Reports\expenseReportMain.rpt";

        ConnectionInfo connectionInfo = new ConnectionInfo();
        connectionInfo.ServerName = "svr-sql";
        connectionInfo.DatabaseName = "intranet";
        connectionInfo.UserID = "sa";
        connectionInfo.Password = "******";

        SetDBLogonForReport(connectionInfo, cr1);
        cr1.SetDataSource(query);
        crystalReportViewer1.ReportSource = cr1;
    }
}

private void SetDBLogonForReport(ConnectionInfo connectionInfo,
                                 expenseReportMain reportDocument)
{
    Tables tables = reportDocument.Database.Tables;
    foreach (CrystalDecisions.CrystalReports.Engine.Table table in tables)
    {
        TableLogOnInfo tableLogonInfo = table.LogOnInfo;
        tableLogonInfo.ConnectionInfo = connectionInfo;
        table.ApplyLogOnInfo(tableLogonInfo);
    }
}

我还根据请求编辑了一些示例数据:

expenseHdr             expenseDtl                employees

rptNo  empPk           expNo   rptNo             pK    name    userid
1      333             3       1                 333   Tom     tom.b
2      240             4       1                 240   Kelly   kelly.c
3      542             5       2                 542   Jean    jean.g
                       6       3

因此,员工表中的任何信息都不会正确显示在报告中。其他两个表中的数据显示正常。

【问题讨论】:

  • 我已经确认查询没有问题,问题依旧未知。每次我尝试在员工表中的报告上显示一个字段时,它只会抓取表中的第一条记录。忽略查询的那一部分。
  • SQL查询是你想要的吗?而LINQ你有什么? SQL 查询中没有 WHERE 子句,而 LINQ 中有 WHERE 子句。这会导致问题吗?
  • 我相信 SQL 查询是由 Crystal 自动生成的,因此我可以访问数据。 linq 查询是寻找我认为正确的特定数据。
  • 如果有人能帮忙的话,仍然不知所措。谢谢

标签: c# winforms c#-4.0 linq-to-sql crystal-reports


【解决方案1】:

这很正常,因为在您的 linq 处理中,您不仅有 join 运算符,而且还有 select many。

你的sql查询:你有三个连接的查询

您的 linq 查询:您选择了很多,有两个 select ,并且对于每个选择,您都有一个 join

所以它总是显示 pk 为零的员工而不是加入中的员工是正常的,因为您没有使用费用 Hdrs 加入员工。

 var query = (from s in db.expenseHdrs
                     join d in db.expenseDtls on s.rptNo equals d.rptNo
                     where s.rptNo == pKReport
                     join g in db.employeess on g.pk equals s.empPk
                     select new
                     {
                        //Adjust your select

                     });

【讨论】:

  • 这不是加入吗? from g in db.employees join r in db.expenseHdrs on g.pk 等于 r.empPk
  • 你能举个例子吗?
  • (从 A 中的 a,其中 A.condition == .. 在 A.id 上的 B 中加入 b 等于 B.id 在 C.id 上的 C 中加入 c 等于 B.id ....
  • from s in db.expenseHdrs join d in db.expenseDtls on s.rptNo 等于 d.rptNo join g in db.employees on s.empPk 等于 g.pk 其中 s.rptNo == pKReport
  • 差不多:g.pk equals d.empPk 应该是s.empPk equals g.pk
【解决方案2】:

我记得通过在两个连接之后放置 where 来更改您的查询,因为之前的定义可能会影响:

var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         where s.rptNo == pKReport
                         join g in db.employees on s.empPk equals g.pk
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

收件人:

var query = (from s in db.expenseHdrs
                         join d in db.expenseDtls on s.rptNo equals d.rptNo
                         join g in db.employees on s.empPk equals g.pk
                         where s.rptNo == pKReport
                         select new
                         {
                             s.period,
                             s.description,
                             s.department,
                             s.rptNo,
                             s.reimbursement,
                             s.purpose,
                             g.name,
                             d.expDate,
                             d.expType,
                             d.expDesc
                     });

将解决您的问题,因为在 sql 中您需要在 where 子句之前加入所有表。

【讨论】:

  • 抱歉,过去几周我忙于在美国各地搬迁。我试过这个,它没有任何区别。谢谢
  • 你能分享你的表格ddl和示例数据吗?
  • 我在原始帖子中编辑了一些示例数据。让我知道是否还有什么我可以为您提供的。我非常感谢您的帮助
  • 正如您的数据所表明的那样,expenseHdr 中的 rptNo 是主键,因此对应于单个员工 ID 所以这是您的基表,并且您有 rptNO 过滤器。现在结果将是单个 rptNo 和单个员工,并且可能有多个扩展区,但员工保持不变。这表明您的举报行为是正常的。
  • 如果是,那么这似乎是水晶报告问题,因为查询似乎可以满足所需的输出。如果您没问题并提供远程访问,那么我可以通过检查您的项目来为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2011-07-16
  • 2012-10-25
  • 1970-01-01
  • 2020-01-02
  • 2020-08-11
  • 1970-01-01
相关资源
最近更新 更多