【问题标题】:Windows Service can't run Stored procedureWindows 服务无法运行存储过程
【发布时间】: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
  • 我有,是的。无济于事。

标签: c# windows stored-procedures service sqlclient


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你是正确的,我假设它没有运行,因为程序所做的更改(在这种情况下,增加运行后返回的记录行数)不会发生。日志中也没有任何内容。我会尝试添加一个休息。连接字符串是正确的,因为我可以从 ssms 和服务成功运行不同的存储过程...感谢您的想法。
  • *应该有...这是漫长的一天。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2013-12-25
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多