コード例 #1
0
        /// <summary>
        /// Writes the results.
        /// </summary>
        /// <returns>The results.</returns>
        /// <param name="path">Path.</param>
        WorkBookStatus WriteResults(Stream path)
        {
            if (!queryRan)
            {
                throw new WorkbookNotStartedException();
            }

            switch (runParameters.BackendMethod)
            {
            case ExcelBackend.Xlsx:
                pts = new XlsxParts(path);
                break;

            // FIXME this isnt an xml backend
            case ExcelBackend.Xml:
                pts = new XlsxParts(path);
                break;

            default:
                pts = new XlsxParts(path);
                break;
            }

            WorkbookTracking w = new WorkbookTracking();

            // start to keep track of the result sets
            int resultSetTotal = 1;

            // loop through the result sets and write the results
            while (queryReader.MoveToNextResultSet())
            {
                // if this result set is over the max results per workbook, close this one and indicate a break has happened
                if (resultSetTotal > runParameters.MaximumResultSetsPerWorkbook)
                {
                    OnSave("Saving incremental result...");
                    pts.Close();
                    return(WorkBookStatus.BreakCompleted);
                }

                resultSetTotal++;

                // write empty columns if requested
                if (runParameters.WriteEmptyResultSetColumns)
                {
                    InitSheet(w);
                }

                // loop through all result sets
                while (queryReader.MoveNext())
                {
                    if (!w.WorksheetOpen)
                    {
                        InitSheet(w);
                    }
                    if (w.WorksheetOpen)
                    {
                        this.DetermineIfRowDependsOnPreviousRow(w);
                        queryReader.Reset();

                        // write the row, or determine why we couldn't write the row
                        WriteARow(w);

                        // if we're over-size, we must return now
                        // but keep the query open bc the caller may request to write the rest of the results
                        if (w.Status == WorkBookStatus.OverSize)
                        {
                            OnSave("Saving incremental result...");
                            if (w.WorksheetOpen)
                            {
                                pts.CloseSheet();
                            }
                            pts.Close();
                            return(w.Status);
                        }
                    }
                }

                if (w.WorksheetOpen)
                {
                    pts.CloseSheet();
                    w.WorksheetOpen = false;
                    w.RowCount      = 0;
                }
            }

            OnSave("Saving final result...");
            pts.Close();
            QueryClose();
            return(WorkBookStatus.Completed);
        }