【问题标题】:How can you see the sql that is causing an error on SubmitChanges in LINQ to SQL?如何查看导致 LINQ to SQL 中的 SubmitChanges 错误的 sql?
【发布时间】:2010-09-16 19:56:31
【问题描述】:

我有一些 LINQ to SQL,有时会抛出

“无法在具有唯一索引的对象 'dbo.Table' 中插入重复的键行 'IX_Indexname'。语句已终止。"

有什么方法可以打开日志记录或至少调试到数据上下文中以查看在引发错误时正在执行的 sql 吗?

更新:我应该提到我知道 GetChangeSet() 方法,我想知道 DataContext 上是否有显示最后执行的 SQL 的属性,或者显示 SQL 的 sql 异常。

关于此错误的奇怪之处在于,在更改集中,只有一个更新,并且唯一正在更改的字段是日期时间字段,该字段不在导致错误的索引中。

【问题讨论】:

    标签: c# .net sql linq linq-to-sql


    【解决方案1】:

    一个简单的方法是使用DataContext.Log 属性:

    using (MyDataContext ctx = new MyDataContext())
    {
        StringWriter sw = new StringWriter();
        ctx.Log = sw;
    
        // execute some LINQ to SQL operations...
    
        string sql = sw.ToString();
        // put a breakpoint here, log it to a file, etc...
    }   
    

    【讨论】:

    • 使用 SQL 分析器将是更好的解决方案,因为您根本不必更改代码。
    【解决方案2】:

    当遇到这些类型的问题时,我一直在使用 SQL 分析器。基本上打开探查器,在保存/更新上设置一个断点,清除探查器,然后只运行该语句。从那里我有所有执行的 SQL,我可以看到生成了什么。 [我主要通过 DataServices 执行此操作,因此 .SaveChanges() 是放置断点的非常方便的位置]

    【讨论】:

      【解决方案3】:

      编写一个测试来隔离导致所有问题的一段或多段代码。设置 DataContext.Log = Console.Out。使用测试运行程序(NUnit、MSTest 等)运行测试。测试运行程序通常会显示打印到 Console.Out 的任何内容以及测试结果。

      【讨论】:

        【解决方案4】:

        您可以使用 SQL 分析器在 SQL 访问 SQL 服务器时查看它。

        如果您想查看您需要使用的变更集中的实际内容:

        context.GetChangedSet();
        

        MSDN - http://msdn.microsoft.com/en-us/library/system.data.linq.datacontext.getchangeset.aspx

        然后,您可以在将每个 SQL 语句发送到服务器之前查看它。

        最后一点是使用 VS 2008 的能力通过 .NET 框架进行调试。

        【讨论】:

          【解决方案5】:

          使用 SQL 事件探查器。它是您的朋友,并附带 SQL。您可以查看正在执行的任何 SQL 语句,完全控制过滤。

          【讨论】:

            【解决方案6】:

            我必须同意 Bradley Grainger 的观点,使用 DataContext.Log 属性是查看已执行 sql 的最佳方式。

            【讨论】:

              猜你喜欢
              • 2013-05-01
              • 1970-01-01
              • 1970-01-01
              • 2011-05-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多