C# 创建临时数据表以存储记录值

C# 创建临时数据表以存储记录值,c#,ado.net,datatable,dataset,batch-processing,C#,Ado.net,Datatable,Dataset,Batch Processing,需要我正在处理的数据集的帮助我有一个包含两个表的数据集一个只包含主键值,即Statementnumber,另一个包含一对多关系的其余细节 现在我想从我的一个表中解析每个statementnumber,从第二个表中获取详细信息,并将该记录放入一个新的数据表中。每次使用for循环创建一条记录,直到到达主表中记录的末尾。我怎样才能做到这一点是c 到目前为止,我在同一个数据集中有两个表 这是我已经有的代码 using System; using System.Collections.Generic; u

需要我正在处理的数据集的帮助我有一个包含两个表的数据集一个只包含主键值,即Statementnumber,另一个包含一对多关系的其余细节

现在我想从我的一个表中解析每个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();

                    }
                }








        }
    }
}
基本上,我希望每次从我的语句表中检索一条记录,并从details表中获取所有详细信息,然后通过crystal report运行它以获得pdf输出

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

但是它制作了一个很长的pdf文件,而不是很小的单语句文件。这就是我要做的。

[替换] 如果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;
    }
否则,您可以使用:

        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 reports中的分组,您可以通过为语句编号创建一个参数并将其传递到报表本身,并让它为您过滤,来实现所需的功能。我不知道细节,但我知道这是可能的

这听起来像是你想把你的第二张桌子做一个完整的副本,还是我遗漏了什么?您的第二个选项卡中是否有与第一个表的记录不对应的记录,并且您希望使用第一个表中的值筛选第二个表,或者您正在尝试执行什么操作?如果您向我们展示您已经尝试过的操作,这将非常有帮助。那么,我正在尝试的是创建一个键值对,并将每个记录运行到crystal report逐行输出到PDF。这是我到目前为止的代码。有没有办法根据上面定义的关系一次输出一条记录并将其放入另一个数据表中?您应该能够一次复制一行。要创建DataTable的空副本,请使用DataTable.Clone。然后,您可以通过将DataRow的ItemArray复制到其中来向其添加一行。我明白您的意思,但我的语句编号在单独的表中。是否有where子句或我可以用来获取特定行的内容示例是将所有行从国内复制到新的数据集中,其中statement number from statement=statement number from national。好的,我现在更好地理解了您的问题,对不起,我没有先详细查看您的代码。我替换了我的答案,我希望这会有所帮助。第二种方法确实将时间缩短了8分钟,但我想我还将研究报告本身,看看这是否有什么不同。我会公布我的发现。