Windows 服务无法运行存储过程

Posted

技术标签:

【中文标题】Windows 服务无法运行存储过程【英文标题】:Windows Service can't run Stored procedure 【发布时间】:2016-08-23 15:20:24 【问题描述】:

好吧,我一直在研究一堆其他问题,但似乎无法在此处找到正确答案...

我正在用 C# 编写一个 Windows 服务来运行一些使用存储过程上传到 SQL Server Express 的数据。该过程相当长,但它包括将数据从 TSV 读取到临时表,然后更新该数据并将其插入到单独的永久表中。目前,存储过程由在 Windows 任务调度程序上运行的批处理文件触发。我正在尝试过渡到可以完成这项工作以及更多其他工作的 Windows 服务。

我遇到的问题是这个存储过程不会从服务中运行。这是我用于服务的调用:

SqlConnection conn = new SqlConnection("user id=reports; Password=*****; Integrated Security=false;" +
                                                "database=data_warehouse; Server=(serverName); ");


        try
         conn.Open();
        
        catch (Exception ex)
        
            Library.WriteErrorLog(ex);
        

        SqlCommand GetSalesCount = new SqlCommand("select count (*) from [sales data] where EventEndDate = convert(date,getdate())");
        GetSalesCount.CommandTimeout = 0;
        GetSalesCount.Connection = conn;


        int? preCount = (int?)GetSalesCount.ExecuteScalar();

        Library.WriteErrorLog("started with " + preCount.ToString() + " records.");

        SqlCommand sql = new SqlCommand("exec LoadSalesData", conn);
        sql.CommandTimeout = 0;

        try
        
           sql.ExecuteNonQuery();
         
        catch (Exception ex)
        
            Library.WriteErrorLog(ex);
        


        // Getting the nuber of sales afterward
        SqlCommand getOffloadCount = new SqlCommand("Select count (*) from [sales data] where EventEndDate = convert(date,getdate())", conn);

        int? post = (int?)getOffloadCount.ExecuteScalar();

        Library.WriteErrorLog("Had " + post.ToString() + " records at End");

        conn.Close();

现在,这不起作用。代码块完成,但没有记录更新,即存储过程没有运行。如果我保存executeNonQuery 的结果,我得到(-1)。如果我使用相同的凭据从 smss 运行相同的exec LoadSalesData,它可以正常工作,最多可能需要 30 秒来处理。

我可以用另一个存储过程替换存储过程,它只是在相同的时间内循环向表中添加行,它运行得很好。

我认为这可能与从服务而不是 ssms 运行的请求有关?权限?我不知道去哪里找。

任何想法都会很棒。谢谢。

【问题讨论】:

您是否尝试过从您的命令中删除exec 并改用sql.CommandType = CommandType.StoredProcedure 我有,是的。无济于事。 【参考方案1】:

如果conn.Opensql.ExecuteNonQuery 都没有抛出异常(显然不是,因为您得到的返回值为-1),那么很可能该过程正在执行。它要么执行该过程,要么抛出异常,因为它要么无法执行该过程,要么该过程本身引发了错误。如果这些都没有发生,那么它正在执行该过程。

听起来您正在确定该过程未执行,因为您没有看到该过程的预期结果。我会考虑程序正在执行但未按预期执行的可能性。

或者您是否有多个版本的过程,并且您正在一个数据库中执行但在另一个数据库中查找结果?发生这种情况 - 您可以验证您正在使用哪个连接字符串。

我会在两个Library.WriteErrorLog(ex) 方法上设置断点,只是为了绝对确保没有到达它们(或者只是查看是否记录了任何错误。)如果没有异常,则程序正在执行。

有时会发生一些看似不可能的事情。当这种情况发生时,通常意味着存在不正确的假设(或多线程 - 这里不是这种情况。)

【讨论】:

你是正确的,我假设它没有运行,因为程序所做的更改(在这种情况下,增加运行后返回的记录行数)不会发生。日志中也没有任何内容。我会尝试添加一个休息。连接字符串是正确的,因为我可以从 ssms 和服务成功运行不同的存储过程...感谢您的想法。 *应该有...这是漫长的一天。

以上是关于Windows 服务无法运行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

使用 Windows 任务计划程序执行存储过程

无法进入远程 SQL Server 2008 上的存储过程

使用批处理建立windows任务,执行sql server 存储过程或SQL语句

无法在雪花数据库中运行存储过程

无法在 dbo 模式中执行存储过程

服务器断电瘫痪数据丢失后恢复数据的过程