C # LINQ Хранимая Процедура - PullRequest
6 голосов
/ 22 июня 2011

У меня есть служба Windows C #, которая связывается с базой данных SQL Server 2008 через LINQ.В LINQ я определил несколько хранимых процедур.Мой сервис в основном просыпается каждые пару минут и просматривает базу данных для обработки.Во время обработки для каждой новой записи выполняется хранимая процедура.После обработки всех записей запускается другая хранимая процедура.У меня очень странная проблема.Для первой хранимой процедуры (запускаемой с каждой записью) все работает нормально.Процедура вызывается, функционирует должным образом, и код продолжается после вызова.Для второй процедуры (запустите одну все обработанные записи) служба просто зависает.Я не получаю сообщение об ошибке, оно не вылетает, оно все еще работает, но ничего не происходит, пока я не перезапущу службу.Если я запускаю процедуру вручную в SQL Server Management Studio, она выполняется правильно и завершается.Я надеюсь, что у кого-то есть представление о том, что здесь происходит.

В цикле каждой записи:

if (Settings.Default.SQLSpatialEnabled)
{
    try
    {
        if ((bool) f.sdrFaultType.TripFault)
        {
            DataContext.sp_locateFault ((int) f.ID);
        }
    }
    catch (Exception ex)
    {
        Logger.Logger.Trace ("Locate fault (" +
                             f.ID +
                             ") exception: " + 
                             ex.Message);
    }
}

После всех записей:

if (Settings.Default.SQLSpatialEnabled)
{
    DataContext.sp_mapFaults ();
    Logger.Logger.Trace ("Faults Mapped");
}

The 'Faults Mapped 'никогда не отображается в журнале, и все в основном останавливается.

Ответы [ 3 ]

1 голос
/ 22 июня 2011

Возможно несколько вариантов:

  • действительно используйте профилировщик, чтобы увидеть, выполняется ли ваш SP вообще или нет;

  • , еслион выполняется, возможно, проблема с блокировкой или длительное время обработки (разные планы выполнения между выполнением вручную и Linq?)

  • , если оно НЕ выполняется, добавьте Logger.Logger.Traceнепосредственно перед DataContext.sp_mapFaults (), чтобы точно знать, что вы туда попали, и оберните DataContext.sp_mapFaults () в try-catch, чтобы увидеть, происходят ли какие-то исключения

1 голос
/ 22 июня 2011

Вы можете запустить SQL Server Profiler, чтобы увидеть параметры, передаваемые в процедуру (при условии, что есть параметры), и посмотреть, не зависает ли это.

Убедитесь, что Settings.Default.SQLSpatialEnabled истинно?

Попробуйте удалить весь другой код и просто посмотрите, работает ли SP самостоятельно?

Попробуйте включить вызовпопробуйте ... поймать, как у вас в цикле.Возможно, что-то выбрасывается и не сообщается?

0 голосов
/ 22 июня 2011

Используете ли вы статический DataContext для всех запросов? Вы пытались использовать отдельные DataContexts для каждого вызова в цикле?

...