首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >linq查询中的未处理异常

问linq查询中的未处理异常
EN

Stack Overflow用户
提问于 2013-05-31 15:58:28
回答 1查看 1.1K关注 0票数 0

说明:由于未处理的异常,进程被终止。异常信息: System.InvalidOperationException Stack: at System.Data.Linq.Table1[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].CheckReadOnly() PublicKeyToken=b77a5c561934e089].DeleteOnSubmit(System.__Canon) 1[System.__Canon,mscorlib,Version=4.0.0.0,Culture=neutral,at System.Data.Linq.Table at ReportSender.EmailReportApp.Execute() at ReportSender.EmailReportApp.Execute() at 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()

在试图删除以下查询中的记录时,我会得到上面的错误:这个错误到底意味着什么,以及如何修复它?

代码语言:javascript
复制
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());
    }
}

其余代码如下:

代码语言:javascript
复制
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);
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-05-31 16:02:13

看起来LINQ正在检查表是否是只读的,并且识别出表是只读的并因此抛出(不能从只读表中删除)。因此,您需要研究为什么LINQ认为该表是只读的。桌子上有主键吗?我知道,没有LINQ是LINQ认为表是只读的一个常见原因(LINQ需要它的身份图)。如果这不起作用,乔治·约翰斯顿的建议尝试将调用移到循环之外的SubmitChanges是一个很好的方法;在表上获得枚举数可能会激活上下文中的只读锁,这就是CheckReadOnly在调用提交时失败的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16861389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档