2013-05-31 74 views
0

说明:由于未处理的异常,进程已终止。 异常信息信息:System.InvalidOperationException堆栈:在 System.Data.Linq.Table 1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].CheckReadOnly()
at System.Data.Linq.Table
1 [[系统_ 佳能,mscorlib程序, 版本= 4.0.0.0,文化=中性 公钥= b77a5c561934e089]] DeleteOnSubmit(。系统。 _Canon)在 ReportSender.EmailReportApp.Execute()在 System.Threading.ThreadHelper.ThreadStart_Context(System.Object的)在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback ,System.Object,Boolean) System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback,System.Object)at System.Threading.ThreadHelper.ThreadStart()linq查询中未处理的异常

我正在试图在下面的查询删除记录时,上面的错误: 这个错误是什么意思准确,我该如何解决?

private void Execute() 
{ 
    try 
    { 
     // Check for a new record 
     DataClasses1DataContext dc = new DataClasses1DataContext(); 

     foreach (var item in dc.reportsSent1s) 
     { 
      string matchedCaseNumber = item.CaseNumberKey; 

      (new MyReportRenderer()).RenderTest(matchedCaseNumber); 

      dc.reportsSent1s.DeleteOnSubmit(item); 
      dc.SubmitChanges(); 
     } 
    } 
    catch (ThreadAbortException ex) 
    { 
     _log.WriteEntry(ex.StackTrace.ToString()); 
    } 
} 

的其余代码如下:

public class MyReportRenderer 
{ 
    private rs2005.ReportingService2005 rs; 
    private rs2005Execution.ReportExecutionService rsExec; 

    public void RenderTest(String matchedCaseNumber) 
    { 
     string HistoryID = null; 
     string deviceInfo = null; 
     string encoding = String.Empty; 
     string mimeType = String.Empty; 
     string extension = String.Empty; 
     rs2005Execution.Warning[] warnings = null; 
     string[] streamIDs = null; 

     rs = new rs2005.ReportingService2005(); 
     rsExec = new rs2005Execution.ReportExecutionService(); 
     rs.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     rsExec.Credentials = System.Net.CredentialCache.DefaultCredentials; 
     rs.Url = "http://***.**.***.**/ReportServer_DEVELOPMENT/ReportService2005.asmx"; 
     rsExec.Url = "http://***.**.***.**/ReportServer_DEVELOPMENT/ReportExecution2005.asmx"; 

     try 
     { 
      // Load the selected report. 
      rsExec.LoadReport("/LawDept/LawDeptTIC", HistoryID); 

      // Set the parameters for the report needed. 

      rs2005Execution.ParameterValue[] parameters = new rs2005Execution.ParameterValue[1]; 
      parameters[0] = new rs2005Execution.ParameterValue(); 
      parameters[0].Name = "CaseNumberKey"; 
      parameters[0].Value = matchedCaseNumber; 

      rsExec.SetExecutionParameters(parameters, "en-us"); 

      // get pdf of report 
      Byte[] results = rsExec.Render("PDF", deviceInfo, 
      out extension, out encoding, 
      out mimeType, out warnings, out streamIDs); 

      //pass paramaters for email 
      DataClasses1DataContext db = new DataClasses1DataContext(); 

      var matchedBRT = (from c in db.GetTable<vw_ProductClientInfo>() 
           where c.CaseNumberKey == matchedCaseNumber 
           select c.BRTNumber).SingleOrDefault(); 

      var matchedAdd = (from c in db.GetTable<vw_ProductClientInfo>() 
           where c.CaseNumberKey == matchedCaseNumber 
           select c.Premises).SingleOrDefault(); 

      //send email with attachment 
      MailMessage message = new MailMessage("[email protected]", "[email protected]", "Report for BRT # " + matchedAdd, "Attached if the Tax Information Certificate for the aboved captioned BRT Number"); 
      MailAddress copy = new MailAddress("[email protected]"); 
      message.CC.Add(copy); 
      SmtpClient emailClient = new SmtpClient("***.**.***.**"); 
      message.Attachments.Add(new Attachment(new MemoryStream(results), String.Format("{0}" + matchedBRT + ".pdf", "BRT"))); 
      emailClient.Send(message); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    } 
} 
+0

这可能是因为你试图从枚举中提交你的删除更改?你有没有尝试移动循环外的提交? –

+0

@乔治约翰斯顿:这是一个很好的理论。在表上使用一个活动的枚举器可以激活上下文中的只读锁,这可以解释对'CheckReadOnly'的失败调用。 – jason

+0

@GeorgeJohnston我也检查了这个理论,并把删除函数放在emailClient.Send(message)后面的最后。并仍然得到相同的错误。我们有没有更好的地方去删除?问题是这张桌子是活跃的,或者我会像对待非服务版本一样杀死整个事物。 – korrowan

回答

1

看起来像LINQ to SQL是检查如果表是只读或没有,被挑剔的表是只读的,抛出的结果(不能从只读表中删除)。因此,您需要调查为什么LINQ to SQL认为该表是只读的。你在桌上有主键吗?我知道没有一个是LINQ to SQL认为表是只读的常见原因(LINQ to SQL需要它为identity map)。如果这不起作用,George Johnstonsuggestion尝试将呼叫移至SubmitChanges以外的循环是很好的;在桌面上获得一个枚举器可能会在上下文中激活只读锁,这就是为什么CheckReadOnly在调用提交失败。

+0

以及它确实有一个主键,但是当我导入表时,我显然没有将它设置为一个。我继续前进,在数据上下文中设置为PK,但是它出现了同样的错误。 – korrowan

+0

@korrowan:尝试George的建议。这是一个好理论;在桌上拿一个枚举器可能会激活一个只读锁,这就是为什么'CheckReadOnly'失败。 – jason

+0

我认为你的模型仍然有问题。当您修改数据库时,是否更新了模型和类?你可以在运行时使用类似'(从dc.Mapping.GetTable(typeof(reportsSent1))中的c来检查你的模型RowType.DataMembers select new {c.DbType,c.Name,c.IsPrimaryKey});' – sgmoore