Как вы можете увидеть SQL, который вызывает ошибку на SubmitChanges в LINQ to SQL? - PullRequest
6 голосов
/ 13 октября 2008

У меня есть LINQ to SQL, который иногда выдает

"Невозможно вставить повторяющуюся строку ключа в объект 'dbo.Table' с уникальным индексом 'IX_Indexname'. Утверждение прекращено. "

Есть ли способ включить ведение журнала или, по крайней мере, отладку в текстовом тексте данных, чтобы увидеть, какой sql выполняется во время возникновения ошибки?

Обновление: Я должен был упомянуть, что знаю о методе GetChangeSet(), мне было интересно, есть ли свойство в DataContext, которое показывает последний выполненный SQL, или свойство в SQL исключение, которое показывает SQL.

Странно, что в этой ошибке есть то, что в наборах изменений есть только одно обновление, и единственное поле, которое изменяется, это поле даты и времени, которого нет в индексе, вызвавшем ошибку.

Ответы [ 6 ]

11 голосов
/ 13 октября 2008

Простой способ сделать это - использовать свойство 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...
}   
2 голосов
/ 13 октября 2008

Напишите тест, чтобы изолировать фрагмент кода, вызывающий все проблемы. Установите DataContext.Log = Console.Out. Запустите тест с помощью testrunner (NUnit, MSTest и т. Д.). Тестеры обычно отображают все, что напечатано в Console.Out вместе с результатами теста.

2 голосов
/ 13 октября 2008

При столкновении с этими проблемами типа я использовал профилировщик SQL. В основном, включаем профилировщик, ставим точку останова при сохранении / обновлении, очищаем профилировщик и затем выполняем только этот оператор. Оттуда у меня есть весь SQL, который был выполнен, и я могу видеть, что было сгенерировано. [В основном я делал это через DataServices, поэтому .SaveChanges () - очень удобное место для установки точки останова]

1 голос
/ 01 декабря 2008

использовать SQL Profiler. Это ваш друг и поставляется с SQL. Вы можете просматривать любые выполняемые операторы SQL с полным контролем над фильтрацией.

1 голос
/ 13 октября 2008

Вы можете использовать профилировщик SQL для просмотра SQL, когда он попадает на сервер SQL.

Если вы хотите увидеть, что на самом деле находится в наборах изменений, вам нужно использовать:

context.GetChangedSet();

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

Затем можно просмотреть каждый оператор SQL до его отправки на сервер.

Ваша последняя задача - использовать возможность отладки VS 2008 с помощью .NET Framework.

0 голосов
/ 01 декабря 2008

Я должен согласиться с Брэдли Грейнджером, используя свойство DataContext.Log - лучший способ увидеть выполненный sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...