C#LINQ存储过程

本文关键字:存储过程 C#LINQ | 更新日期: 2023-09-27 17:59:52

我有一个C#窗口服务,它通过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");
}

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

C#LINQ存储过程

可能有几个选项:

  • 确实可以使用探查器来查看您的SP是否正在执行;

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

  • 如果未执行,则添加Logger。记录器。在DataContext.sp_mapFaults

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

更新

确保Settings.Default.SQLSpatialEnabled为真?

试着去掉所有其他代码,看看SP是否独立运行?

尝试在Try中结束呼叫。。。像你在循环中一样接球。也许有什么东西被扔了而没有被报告?

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