好吧,我已经看了很多其他问题,但似乎在这里找不到正确的答案。。。
我正在用C#编写一个windows服务,用存储过程将一些数据上传到SQLServerExpress中。这个过程相当长,但它包括将数据从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有关?权限?我不知道该往哪里看。
任何想法都很棒。谢谢
如果conn.Open
和sql.ExecuteNonQuery
都没有抛出异常(显然没有,因为您得到的返回值为-1),那么很可能该过程正在执行。它要么执行过程,要么抛出异常,因为它要么无法执行过程,或者过程本身引发了错误。如果这些都没有发生,那么它正在执行过程。
这听起来像是因为你看不到过程的预期结果而确定过程没有执行。我会考虑程序正在执行但没有按预期执行的可能性。
或者,您可能有多个版本的过程,并且您在一个数据库中执行,但在另一个数据库查找结果?这种情况会发生——你可以验证你正在使用哪个连接字符串。
我会在两个Library.WriteErrorLog(ex)
方法上都设置断点,只是为了绝对确保它们没有被访问(或者只是看看是否有任何错误被记录下来。)如果没有异常,那么过程正在执行。
有时会发生一些看似不可能的事情。当这种情况发生时,通常意味着存在错误的假设(或多线程-这里不是这种情况。)