【问题标题】:create a temp datatable to store values of records创建一个临时数据表来存储记录的值
【发布时间】:2013-05-02 18:32:01
【问题描述】:

我正在处理的数据集需要帮助我有一个包含 2 个表的数据集,其中一个仅包含主键值,即“Statementnumber”,另一个包含具有一对多关系的其余详细信息

现在我想从我的一个表中解析每个语句编号,从第二个表中获取详细信息并将该记录放入新的数据表中。一次使用 for 循环记录一条记录,直到我到达主表中的记录末尾。这是 c# 我该怎么做?

到目前为止,我在同一个数据集中有两个表。

这是我已有的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Oracle.DataAccess.Client;
using System.Data;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;


namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        protected void Button1_Click(object sender, EventArgs e)
        {
            string connetionString = null;
            OracleConnection connection;
            OracleDataAdapter OracleAdapter;
            DataSet ds = new DataSet();
            string firstSql = null;


            connetionString = "DataSoruce

            connection = new OracleConnection(connetionString);
            firstSql = @"SELECT DISTINCT statement_header.statementnumber,
                     statement_details.invoicedate,
                     statement_details.invoicenumber,
                     statement_details.invoicetotal,
                     statement_details.doc_type,
                     statement_header.statementtotal,
                     statement_details.bunumber_ru,
                     statement_details.bunumber,
                     statement_details.description,
                     statement_details.reference_number,
                     statement_header.remto_zip,
                     statement_header.remto_city,
                     statement_header.remto_state,
                     statement_header.remto_mailname,
                     statement_header.remto_addr1,
                     statement_header.remto_addr2,
                     statement_header.remto_addr3,
                     statement_header.soldto_city,
                     statement_header.soldto_state,
                     statement_header.soldto_zip,
                     statement_header.soldto_addr1,
                     statement_header.soldto_addr2,
                     statement_header.soldto_addr3,
                     statement_header.balance_forward,
                     statement_header.statementdate,
                     statement_header.custid,
                     statement_header.custname,
                     statement_header.phone_prefix,
                     statement_header.phone_number,
                     statement_details.purchases,
                     statement_details.payments,
                     statement_details.misc_credit2,
                     statement_details.misc_credit1,
                     statement_header.company_number,
                     statement_header.statementpurchases,
                     statement_header.statementpayments,
                     statement_header.statementmisc_credit1,
                     statement_header.statementmisc_credit2,
                     statement_header.nomailnoprint,
                     statement_header.SOLDTOCOUNTRYCODE,
                     statement_header.SOLDTOCOUNTRYNAME,
                     statement_header.CREDITZEROFLAG
       FROM STATEMENT_DATA_DOMESTIC statement_header
            INNER JOIN STATEMENT_DATA_DOM_DETAILS statement_details
               ON statement_header.statementnumber =
                     statement_details.statementnumber";
            string secondSql = "select statementnumber from statement_data_domestic";
                connection.Open();
                OracleAdapter = new OracleDataAdapter(firstSql, connection);
                OracleAdapter.Fill(ds, "domestic");
                OracleAdapter = new OracleDataAdapter(secondSql, connection);
                OracleAdapter.Fill(ds, "statement");

            OracleAdapter.Dispose();
                connection.Close();

                ds.Relations.Add("Statementnumber", ds.Tables["statement"].Columns["statementnumber"], ds.Tables["domestic"].Columns["statementnumber"]);



    //GridView1.DataSource = ds.Tables[1];
           //   GridView1.DataBind();
                ReportDocument reportDoc = new ReportDocument();
                reportDoc.Load(@"c:\users\soniara\desktop\statement.rpt");
                DataTable d3 = ds.Tables["statement"];
                foreach (DataRow arpan in d3.Rows)
                {
                    DataRow[] details = arpan.GetChildRows("Statementnumber");


                    foreach (DataRow detail in details)
                    {

                        reportDoc.SetDataSource(detail);
                        ExportOptions CrExportOptions;
                        DiskFileDestinationOptions CrDiskFileDestinationOptions = new DiskFileDestinationOptions();
                        PdfRtfWordFormatOptions CrFormatTypeOptions = new PdfRtfWordFormatOptions();
                        CrDiskFileDestinationOptions.DiskFileName = @"d:\Converte5_1_13"+detail+".pdf";
                        CrExportOptions = reportDoc.ExportOptions;
                        {
                            CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
                            CrExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat;
                            CrExportOptions.DestinationOptions = CrDiskFileDestinationOptions;
                            CrExportOptions.FormatOptions = CrFormatTypeOptions;

                        }
                        reportDoc.Export();

                    }
                }








        }
    }
}

基本上我想从我的语句表中一次检索一条记录,并从详细信息表中获取所有详细信息,然后通过水晶报表运行它以获得 pdf 输出

如果我只是将整个数据集作为源代码提供给 crytalreport.setdatasrouce,我的代码就可以正常工作

但它会生成一个很长的 pdf 文件,而不是小的单个语句文件。这就是我想要做的。

【问题讨论】:

  • 这听起来像是您想制作第二张表的完整副本,还是我遗漏了什么?您的第二个表格中是否有与您的第一个表格的记录不对应的记录,并且您想使用第一个表格中的值过滤第二个表格,或者您要做什么?
  • 如果您向我们展示您已经尝试过的内容将会很有帮助。
  • 好吧,我想做的是有一个键值对,并将每条记录逐行运行到水晶报表并将其导出为 PDF。
  • 这是我到目前为止的代码..

标签: c# ado.net datatable dataset batch-processing


【解决方案1】:

[替换] 如果 CrystalReports 支持 DataView 对象作为数据源,您可以使用:

        foreach (DataRow statementRow in ds.Tables["statement"].Rows)
        {
            var detail = new DataView(ds.Tables["domestic"])
            {
                RowFilter = String.Format("statementnumber = {0}", statementRow["statementnumber"]),
                Sort = "" // optional
            };


            reportDoc.SetDataSource(detail);
                            ....
                      }

否则你可以使用这个:

    foreach (DataRow statementRow in ds.Tables["statement"].Rows)
    {
        var detail = GetFilteredTable(ds.Tables["domestic"], statementRow["statementNumber"]);

        reportDoc.SetDataSource(detail);
                        ....
    }


    public DataTable GetFilteredTable(DataTable dt, object statementNumber)
    {
        var detailRows = dt.Select(String.Format("statementnumber = {0}", statementNumber));
        var filteredDt = dt.Clone();
        foreach (var detailRow in detailRows)
        {
            filteredDt.Rows.Add(detailRow.ItemArray);
        }
        return filteredDt;
    }

另一个建议是,您可能希望研究 Crystal 报表中的分组,您可以通过为语句编号创建参数并将其传递到报表本身并让它为您过滤来实现您需要的功能。我不知道细节,但我知道这是可能的。

【讨论】:

  • 有没有办法根据上面定义的关系一次取出一条记录并将其放在另一个数据表中?
  • 您应该可以一次复制一行。要创建 DataTable 的空副本,请使用 DataTable.Clone。然后,您可以通过将 DataRow 的 ItemArray 复制到其中来添加一行。
  • 我明白你的意思,但我的报表编号在单独的表格中。是否有 where 子句或我可以用来获取特定行示例的方法是将所有行从国内复制到新数据集中,其中语句编号 = 国内语句编号。
  • 好的,我现在更好地理解了您的问题,抱歉我没有先详细查看您的代码。我替换了我的答案,我希望这会有所帮助。
  • 第二种方法确实将时间缩短了 8 分钟,但我想我也会研究一下报告本身,看看是否有什么不同。生病发布我的发现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-04
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多