C#LINQ存储过程

C#LINQ存储过程,c#,linq,sql-server-2008,linq-to-sql,windows-services,C#,Linq,Sql Server 2008,Linq To Sql,Windows Services,我有一个C#windows服务,它通过LINQ与SQL Server 2008数据库通信。在LINQ中,我定义了几个存储过程。我的服务基本上每隔几分钟就会唤醒,并在数据库中查找要处理的内容。在处理过程中,它为每个新记录运行一个存储过程。处理完所有记录后,它将运行另一个存储过程。我有一个很奇怪的问题。对于第一个存储过程(与每条记录一起运行),一切正常。过程被调用,功能正常,代码在调用后继续。对于第二个过程(运行一个所有已处理的记录),服务只是挂起。我没有收到错误消息,它没有崩溃,它似乎仍在运行,但

我有一个C#windows服务,它通过LINQ与SQL Server 2008数据库通信。在LINQ中,我定义了几个存储过程。我的服务基本上每隔几分钟就会唤醒,并在数据库中查找要处理的内容。在处理过程中,它为每个新记录运行一个存储过程。处理完所有记录后,它将运行另一个存储过程。我有一个很奇怪的问题。对于第一个存储过程(与每条记录一起运行),一切正常。过程被调用,功能正常,代码在调用后继续。对于第二个过程(运行一个所有已处理的记录),服务只是挂起。我没有收到错误消息,它没有崩溃,它似乎仍在运行,但在我重新启动服务之前它不会做任何事情。如果我在SQLServerManagementStudio中手动运行该过程,它将正确执行并完成。我希望有人知道这里发生了什么

在每个记录的循环中:

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");
}

“已映射的故障”从未出现在日志中,所有操作基本停止。

您可以启动SQL Server Profiler,查看传递到过程中的参数(假设存在参数),并查看这是否是挂起的问题

更新

确保
Settings.Default.SQLSpatialEnabled
为true

尝试删除所有其他代码,看看SP是否独立运行

尝试将呼叫包装为Try…像在循环中一样捕获。可能有东西被抛出而未报告?

可能有几个选项:

  • 确实,使用探查器查看您的SP是否正在执行

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

  • 如果未执行,请在执行之前添加Logger.Logger.Trace DataContext.sp_mapFaults()以确定您是否到达了目的地,并将DataContext.sp_mapFaults()包装在一个try catch中,以便查看是否发生了某些执行


您是否对所有查询使用静态数据上下文?您是否尝试为循环中的每个调用使用单独的DataContext?

能否显示用于调用存储过程的代码。不幸的是,没有参数。至少在探查器中,您可以看到SP正在执行。请问这有什么好处?我使用的是静态的,这样我就不必不断地重新创建对象。LINQ数据上下文是短期的。其他人可以提供比我更雄辩的描述,因此尝试搜索其他信息。我问这个问题的原因是,我在尝试通过Windows服务拨打LINQ电话时遇到了类似的情况。通过改变LINQ调用的结构,我能够解决这个问题。我的建议只是一种预感。