2010-08-13 148 views
0

我的用户希望能够直接打印我在VS 2010中设计的报告,而不是通过预览报告的过程。我在VS 2010中设计了报告,使用那里的报告设计器创建了一个.rdlc文件。我用下面的MSDN演练作为一个例子,我的代码:打印到本地打印机时出现错误

http://msdn.microsoft.com/en-us/library/ms252091(v=VS.80).aspx

在我的情况,而不是数据在XML文件之中,我从一个SQL Server数据库中检索数据,并我有一个.xsd文件等。另外,我将参数传递给报告。将传递的数据集和ReportParameters分配给报表似乎没问题。下面的代码的片段,最后一行是发生错误行:

string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.4in</MarginTop>" +
" <MarginLeft>0.5in</MarginLeft>" +
" <MarginRight>0.5in</MarginRight>" +
" <MarginBottom>0.4in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();
report.Render("Image", deviceInfo, CreateStream, out warnings);

和这里的错误消息我得到:

 
Microsoft.Reporting.WinForms.LocalProcessingException was unhandled 
    Message=An error occurred during local report processing. 
    Source=Microsoft.ReportViewer.WinForms 
    StackTrace: 
     at Microsoft.Reporting.WinForms.LocalReport.InternalRender(String format, Boolean allowInternalRenderers, String deviceInfo, PageCountMode pageCountMode, CreateAndRegisterStream createStreamCallback, Warning[]& warnings) 
     at Microsoft.Reporting.WinForms.LocalReport.Render(String format, String deviceInfo, PageCountMode pageCountMode, CreateStreamCallback createStream, Warning[]& warnings) 
     at Microsoft.Reporting.WinForms.LocalReport.Render(String format, String deviceInfo, CreateStreamCallback createStream, Warning[]& warnings) 
     at SimpleWinForms.PrintRfsDirectly.Export(LocalReport report) in C:\Users\Rodf\Documents\Visual Studio 2010\Projects\SimpleWinForms\SimpleWinForms\PrintRfsDirectly.cs:line 62 
     at SimpleWinForms.PrintRfsDirectly..ctor(spRequestForServicesReport2DataTable RfsTable, ReportParameter AmciName, ReportParameter ClientNumberParameter, ReportParameter CaseNumberParameter, ReportParameter ClientNameParameter, String RdlcFileName) in C:\Users\Rodf\Documents\Visual Studio 2010\Projects\SimpleWinForms\SimpleWinForms\PrintRfsDirectly.cs:line 35 
     at SimpleWinForms.ShowReport.ShowReport_Load(Object sender, EventArgs e) in C:\Users\Rodf\Documents\Visual Studio 2010\Projects\SimpleWinForms\SimpleWinForms\ShowReport.cs:line 54 
     at System.Windows.Forms.Form.OnLoad(EventArgs e) 
     at System.Windows.Forms.Form.OnCreateControl() 
     at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible) 
     at System.Windows.Forms.Control.CreateControl() 
     at System.Windows.Forms.Control.WmShowWindow(Message& m) 
     at System.Windows.Forms.Control.WndProc(Message& m) 
     at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
     at System.Windows.Forms.Form.WmShowWindow(Message& m) 
     at System.Windows.Forms.Form.WndProc(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
     at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
     at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
     at System.Windows.Forms.SafeNativeMethods.ShowWindow(HandleRef hWnd, Int32 nCmdShow) 
     at System.Windows.Forms.Control.SetVisibleCore(Boolean value) 
     at System.Windows.Forms.Form.SetVisibleCore(Boolean value) 
     at System.Windows.Forms.Control.Show() 
     at SimpleWinForms.Form1.btnPrintRFS_Click(Object sender, EventArgs e) in C:\Users\Rodf\Documents\Visual Studio 2010\Projects\SimpleWinForms\SimpleWinForms\Form1.cs:line 55 
     at System.Windows.Forms.Control.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.OnClick(EventArgs e) 
     at System.Windows.Forms.Button.PerformClick() 
     at System.Windows.Forms.Form.ProcessDialogKey(Keys keyData) 
     at System.Windows.Forms.Control.ProcessDialogKey(Keys keyData) 
     at System.Windows.Forms.Control.PreProcessMessage(Message& msg) 
     at System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target, Message& msg) 
     at System.Windows.Forms.Application.ThreadContext.PreTranslateMessage(MSG& msg) 
     at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNativeMethods.IMsoComponent.FPreTranslateMessage(MSG& msg) 
     at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
     at System.Windows.Forms.Application.Run(Form mainForm) 
     at SimpleWinForms.Program.Main() in c:\users\rodf\documents\visual studio 2010\Projects\SimpleWinForms\SimpleWinForms\Program.cs:line 18 
     at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) 
     at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
     at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
     at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx) 
     at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
     at System.Threading.ThreadHelper.ThreadStart() 
    InnerException: Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException 
     Message=An error has occurred during report processing. 
     Source=Microsoft.ReportViewer.Common 
     ExceptionLevelHelpLink=http://go.microsoft.com/fwlink/?LinkId=20476&EvtSrc=Microsoft.ReportingServices.Diagnostics.Utilities.ErrorStrings&EvtID=rsProcessingAborted&ProdName=Microsoft%20SQL%20Server%20Reporting%20Services&ProdVer=1.0 
     SkipTopLevelMessage=false 
     StackTrace: 
      at Microsoft.ReportingServices.OnDemandProcessing.OnDemandProcessingContext.AbortHelper.ThrowAbortException(String reportUniqueName) 
      at Microsoft.ReportingServices.OnDemandProcessing.OnDemandProcessingContext.CheckAndThrowIfAborted() 
      at Microsoft.ReportingServices.OnDemandProcessing.RetrievalManager.FetchData(Boolean mergeTran) 
      at Microsoft.ReportingServices.OnDemandProcessing.RetrievalManager.PrefetchData(ReportInstance reportInstance, ParameterInfoCollection parameters, Boolean mergeTran) 
      at Microsoft.ReportingServices.OnDemandProcessing.Merge.FetchData(ReportInstance reportInstance, Boolean mergeTransaction) 
      at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.ProcessOdpReport(Report report, OnDemandMetadata odpMetadataFromSnapshot, ProcessingContext pc, Boolean snapshotProcessing, Boolean reprocessSnapshot, Boolean processUserSortFilterEvent, Boolean processWithCachedData, ErrorContext errorContext, DateTime executionTime, IChunkFactory cacheDataChunkFactory, StoreServerParameters storeServerParameters, GlobalIDOwnerCollection globalIDOwnerCollection, SortFilterEventInfoMap oldUserSortInformation, EventInformation newUserSortInformation, String oldUserSortEventSourceUniqueName, ExecutionLogContext executionLogContext, OnDemandProcessingContext& odpContext) 
      at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.RenderReport(IRenderingExtension newRenderer, DateTime executionTimeStamp, ProcessingContext pc, RenderingContext rc, IChunkFactory cacheDataChunkFactory, IChunkFactory yukonCompiledDefinition, Boolean& dataCached) 
      at Microsoft.Reporting.LocalService.CreateSnapshotAndRender(CatalogItemContextBase itemContext, ReportProcessing repProc, IRenderingExtension renderer, ProcessingContext pc, RenderingContext rc, SubreportCallbackHandler subreportHandler, ParameterInfoCollection parameters, DatasourceCredentialsCollection credentials) 
      at Microsoft.Reporting.LocalService.Render(CatalogItemContextBase itemContext, Boolean allowInternalRenderers, ParameterInfoCollection reportParameters, IEnumerable dataSources, DatasourceCredentialsCollection credentials, CreateAndRegisterStream createStreamCallback, ReportRuntimeSetup runtimeSetup) 
      at Microsoft.Reporting.WinForms.LocalReport.InternalRender(String format, Boolean allowInternalRenderers, String deviceInfo, PageCountMode pageCountMode, CreateAndRegisterStream createStreamCallback, Warning[]& warnings) 
     InnerException: Microsoft.ReportingServices.ReportProcessing.ReportProcessingException 
      Message=RfsDataSet 
      Source=Microsoft.ReportViewer.Common 
      ExceptionLevelHelpLink=http://go.microsoft.com/fwlink/?LinkId=20476&EvtSrc=Microsoft.ReportingServices.Diagnostics.Utilities.ErrorStrings&EvtID=rsErrorCreatingDataReader&ProdName=Microsoft%20SQL%20Server%20Reporting%20Services&ProdVer=1.0 
      SkipTopLevelMessage=false 
      StackTrace: 
       at Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.RunDataSetQuery() 
       at Microsoft.ReportingServices.OnDemandProcessing.TablixProcessing.RuntimeOnDemandDataSet.Process() 
       at Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.ProcessConcurrent(Object threadSet) 
      InnerException: 

+0

您的异常转储被截断,就像它变得有趣一样。 – 2010-08-13 16:42:08

+0

不幸的是,这就是VS 2010给我的全部内容。 – Rod 2010-08-16 16:27:56

回答

2

我碰到这个错误之际,并且在运行render方法时最终将它追踪到在CreateStream回调中创建文件流的权限问题。在创建文件流时,会引发访问异常。简单地用一个唯一的临时名称替换静态文件名以解决问题:

// Routine to provide to the report renderer, in order to save an image for each page of the report. 
    private Stream CreateStream(string name, string fileNameExtension, Encoding encoding, 
     string mimeType, bool willSeek) 
    {    
     Stream stream = new FileStream(Path.GetTempFileName(), FileMode.Create);    
     m_streams.Add(stream); 
     return stream; 
    }