如何在LINQ to sql中查看导致SubmitChanges错误的sql



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

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

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

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

这个错误的奇怪之处在于,在变更集中,只有一个更新&唯一正在更改的字段是导致错误的索引中没有的日期时间字段。

一个简单的方法是使用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探查器。基本上打开探查器,在保存/更新上设置一个断点,清除探查器,然后只运行该语句。从那里我有了所有执行的SQL,我可以看到生成了什么。[我主要是通过DataServices来完成这项工作的,所以.SaveChanges()是放置断点的一个非常方便的位置]

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

您可以使用SQL探查器在SQL到达SQL服务器时查看它。

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

context.GetChangedSet();

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

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

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

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

我同意Bradley Grainger使用DataContext。Log属性是查看执行的sql的最佳方式。

相关内容

  • 没有找到相关文章

最新更新