Windows服务无法运行存储过程

时间:2016-04-28 17:38:46

标签: c# windows stored-procedures service sqlclient

好吧,我一直在看其他一些问题,但似乎无法在这里找到正确的答案......

我正在用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?权限?我不确定在哪里看。

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

1 个答案:

答案 0 :(得分:0)

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

听起来您确定程序没有执行,因为您没有看到程序的预期结果。我考虑了程序执行的可能性,但没有做出预期的事情。

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

我在两个Library.WriteErrorLog(ex)方法上都设置断点,只是为了绝对确定它们没有被触及(或者只是看看是否记录了任何错误。)如果没有例外那么程序正在执行。

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