C#LINQ存储过程

时间:2011-06-22 15:03:43

标签: c# linq sql-server-2008 linq-to-sql windows-services

我有一个C#windows服务,它通过LINQ与SQL Server 2008数据库通信。在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");
}

映射的故障'永远不会出现在日志中,一切都基本停止。

3 个答案:

答案 0 :(得分:1)

您可以启动SQL Server Profiler以查看传递给过程的参数(假设有参数)并查看是否挂起了这些参数。

<强>更新

确保Settings.Default.SQLSpatialEnabled为真?

尝试取出所有其他代码,看看SP是否独立运行?

尝试在try ...中包装调用,就像你在循环中一样。也许有些东西被抛出而没有被报道?

答案 1 :(得分:1)

也许有几个选项:

  • 确实使用分析器来查看您的SP是否正在执行;

  • 如果正在执行,可能是锁定问题还是处理时间过长(手动和Linq执行之间的执行计划不同?)

  • 如果没有执行,请在之前添加Logger.Logger.Trace DataContext.sp_mapFaults()确定你到达那里并在try-catch中包装DataContext.sp_mapFaults(),以便查看是否发生了一些exec

答案 2 :(得分:0)

您是否对所有查询使用静态DataContext?您是否尝试在循环中为每个调用使用单独的DataContexts?