2016-04-28 62 views
0

好吧,我一直在看一堆其他的问题,但似乎无法在这里找到正确的答案...Windows服务无法运行存储过程

我写一窗口服务C#使用存储过程将一些数据上传到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有关吗?权限?我不确定在哪里看。

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

+0

您是否尝试删除'exec'命令并使用'sql.CommandType = CommandType.StoredProcedure'来代替? –

+0

我有,是的。无济于事。 –

回答

0

如果conn.Open或都不是抛出异常(显然不是,因为你得到的返回值为-1),那么最有可能的过程正在执行。它要么执行过程要么抛出异常,因为它不能执行过程,或者过程本身引发错误。如果没有发生,那么它正在执行该程序。

听起来好像你正在确定过程没有执行,因为你没有看到过程的预期结果。我会考虑程序执行的可能性,但不会做出预期的结果。

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

我会在Library.WriteErrorLog(ex)方法上加上断点,以确保它们没有被访问(或者只是查看是否有任何错误被记录)。如果没有例外,那么该过程正在执行。

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

+0

你是对的,我假设它没有运行,因为改变了程序出来(在这种情况下,增加它运行后返回的记录行数)不会发生。日志中也没有任何东西出现。我会尝试添加一个休息。连接字符串是正确的,因为我可以从ssms和服务中成功运行不同的存储过程... 感谢您的想法。 –

+0

*应该有......这是漫长的一天。 –