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.Open
或sql.ExecuteNonQuery
都没有抛出异常(显然不是,因为您得到的返回值为-1),那么很可能该过程正在执行。它要么执行该过程,要么抛出异常,因为它要么无法执行该过程,要么该过程本身引发了错误。如果这些都没有发生,那么它正在执行该过程。
听起来您正在确定该过程未执行,因为您没有看到该过程的预期结果。我会考虑程序正在执行但未按预期执行的可能性。
或者您是否有多个版本的过程,并且您正在一个数据库中执行但在另一个数据库中查找结果?发生这种情况 - 您可以验证您正在使用哪个连接字符串。
我会在两个Library.WriteErrorLog(ex)
方法上设置断点,只是为了绝对确保没有到达它们(或者只是查看是否记录了任何错误。)如果没有异常,则程序正在执行。
有时会发生一些看似不可能的事情。当这种情况发生时,通常意味着存在不正确的假设(或多线程 - 这里不是这种情况。)
【讨论】:
你是正确的,我假设它没有运行,因为程序所做的更改(在这种情况下,增加运行后返回的记录行数)不会发生。日志中也没有任何内容。我会尝试添加一个休息。连接字符串是正确的,因为我可以从 ssms 和服务成功运行不同的存储过程...感谢您的想法。 *应该有...这是漫长的一天。以上是关于Windows 服务无法运行存储过程的主要内容,如果未能解决你的问题,请参考以下文章