繁体   English   中英

如何看待在LINQ to SQL中的SubmitChanges上导致错误的sql?

[英]How can you see the sql that is causing an error on SubmitChanges in LINQ to SQL?

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

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

有没有什么方法可以打开日志记录或至少调试到datacontext,看看在出现错误时正在执行什么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语句发送到服务器之前查看它们。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM