好吧,我一直在看其他一些问题,但似乎无法在这里找到正确的答案......
我正在用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?权限?我不确定在哪里看。
任何想法都会很棒。感谢。
答案 0 :(得分:0)
如果conn.Open
或sql.ExecuteNonQuery
都没有抛出异常(显然不是,因为您的返回值为-1),那么很可能该过程正在执行。它要么执行过程要么抛出异常,因为它要么不能执行过程,要么过程本身引发了错误。如果没有发生这种情况,那么它就会执行该程序。
听起来您确定程序没有执行,因为您没有看到程序的预期结果。我考虑了程序执行的可能性,但没有做出预期的事情。
或者,您是否可以拥有多个版本的过程,并且您在一个数据库中执行但是在另一个数据库中查找结果?发生这种情况 - 您可以验证您正在使用的连接字符串。
我在两个Library.WriteErrorLog(ex)
方法上都设置断点,只是为了绝对确定它们没有被触及(或者只是看看是否记录了任何错误。)如果没有例外那么程序正在执行。
有时发生的事情似乎是不可能的。当发生这种情况时,通常意味着存在不正确的假设(或多线程 - 这不是这种情况。)