2013-05-08 4 views
0

SO здесь. У меня есть модель набора данных, которая работает отлично, и она импортирует данные из базы данных и дает ей отчет о кристалле. это решение работает, но это очень много времени, мне было интересно, есть ли другой способ сделать это ...Есть ли лучший способ сделать это?

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); 
       string secondSql = "select statementnumber from erocks.statement_data_domestic"; 
       connection.Open(); 
       //OracleAdapter = new OracleDataAdapter(firstSql, connection); 
       //OracleAdapter.Fill(ds, "domestic"); 
       OracleAdapter = new OracleDataAdapter(secondSql, connection); 
       OracleAdapter.Fill(ds, "statement"); 
       connection.Close(); 
       ReportDocument reportDoc = new ReportDocument(); 
       reportDoc.Load(@"c:\users\desktop\statement.rpt"); 


      DataTable stmt = ds.Tables["statement"]; 

      string stmtnumber=""; 
      for (int i = 0; i < stmt.Rows.Count - 1; i++) 
      { 
       stmtnumber = stmt.Rows[i][0].ToString(); 

       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_DETAILS statement_details 
       ON statement_header.statementnumber = 
        statement_details.statementnumber 
         where statement_header.statementnumber="+stmtnumber; 
       connection.Open(); 
       OracleAdapter = new OracleDataAdapter(firstSql, connection); 
       OracleAdapter.Fill(ds, "domestic"); 

       OracleAdapter.Dispose(); 
       connection.Close(); 
       reportDoc.SetDataSource(ds.Tables["domestic"]); 
       ExportOptions CrExportOptions; 
       DiskFileDestinationOptions CrDiskFileDestinationOptions = new DiskFileDestinationOptions(); 
       PdfRtfWordFormatOptions CrFormatTypeOptions = new PdfRtfWordFormatOptions(); 
       CrDiskFileDestinationOptions.DiskFileName = @"d:\pdf\"+ stmtnumber + ".pdf"; 
       CrExportOptions = reportDoc.ExportOptions; 
       { 
        CrExportOptions.ExportDestinationType = ExportDestinationType.DiskFile; 
        CrExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat; 
        CrExportOptions.DestinationOptions = CrDiskFileDestinationOptions; 
        CrExportOptions.FormatOptions = CrFormatTypeOptions; 

       } 
       reportDoc.Export(); 
       ds.Tables["domestic"].Clear(); 
      } 
       } 
      } 

     } 
+1

Занимает много времени? Вы прошли через код? Есть много данных? в чем именно проблема?: – LittleBobbyTables

+0

много данных, которые занимает слишком много времени для обработки, запись по записи. Я также открываю и закрываю соединение с базой данных. Я думал, есть ли способ, которым я могу получить все данные в таблице данных, а некоторые, как реплицировать точный – user2315840

+0

, например, заполнить ds.Tables ["internal"] всеми данными из базы данных, заполнить ds.tables [ statement "] со всеми номерами операторов. закрыть связь с базой данных. теперь анализируйте каждую запись из ds.tables ["statement"], чтобы получить все относительные данные из внутреннего для этого номера номера и поместить его в datatable, который будет передавать его в crystalreport. – user2315840

ответ

0

Это будет быстрее, если вы получите данные для всех операторов, сгруппировать его по StatementId внутри отчета и разорвать отчет этой группы. Bursting создаст отдельный файл для каждой группы. Таким образом, вы сможете сгенерировать все файлы с одним вызовом в базу данных.

+0

Я новичок в хрустальном отчете. , как я могу вспять какие-нибудь примеры, которыми вы можете поделиться? – user2315840

Смежные вопросы