0

说明:进程因未处理的异常而终止。异常信息:System.InvalidOperationException 堆栈:在 System.Data.Linq.Table 1[[System._Canon , mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].DeleteOnSubmit( System._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) 在 System.Threading.ThreadHelper.ThreadStart()1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].CheckReadOnly()
at System.Data.Linq.Table

尝试删除以下查询中的记录时出现上述错误:此错误的确切含义是什么以及如何解决?

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("Rts@acmets.com", "gge.grer@gmail.com", "Report for BRT # " + matchedAdd, "Attached if the Tax Information Certificate for the aboved captioned BRT Number");
            MailAddress copy = new MailAddress("cts@gmail.com");
            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);
        }
    }
}
4

1 回答 1

1

看起来 LINQ to SQL 正在检查表是否是只读的,并且正在辨别该表是只读的并因此抛出(您不能从只读表中删除)。因此,您需要调查为什么 LINQ to SQL 认为该表是只读的。你的桌子上有主键吗?我知道没有一个是 LINQ to SQL 认为一个表是只读的(LINQ to SQL 需要它作为它的标识映射)的常见原因。如果这不起作用,George Johnston建议尝试将调用移到SubmitChanges循环之外是一个很好的建议;在表上获取枚举器可能会激活上下文中的只读锁,这就是CheckReadOnly提交调用失败的原因。

于 2013-05-31T16:02:13.337 回答