2016-04-28 14 views
0

よしを実行することはできません、私は他の質問の束を見てきたが、ここでは正しい答えを見つけるように見えることはできません...Windowsサービスは、ストアドプロシージャ

私はで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が返されているため)、プロシージャが実行されている可能性が最も高いです。プロシージャを実行できなかったか、プロシージャ自体がエラーを発生させたため、プロシージャを実行するか例外をスローします。それが起こっていなければ、プロシージャを実行しています。

プロシージャの期待される結果が表示されないため、プロシージャが実行されていないと判断されるようです。私はプロシージャが実行されている可能性は考えていますが、期待されることはしません。

複数のバージョンのプロシージャがあり、1つのデータベースで実行していますが、別のデータベースで結果を検索できますか?それはあなたが使用している接続文字列を確認することができます。

Library.WriteErrorLog(ex)の両方のメソッドにブレークポイントを設定すると、到達していないことを絶対に確かめることができます(または、エラーが記録されているかどうかを確認するだけです)。例外がない場合は、プロシージャが実行されます。

時には何かが起こり、不可能に見えます。それが起こると、通常は間違った前提があることを意味します(またはここではマルチスレッドではありません)。

+0

プロシージャの変更(この場合、実行後に戻されるレコード行数の増加)が発生しないため、実行されなかったものとします。ログには何も表示されません。私は休憩を追加しようとします。私は両方のSSMSとサービスから正常に別のストアドプロシージャを実行することができるので、接続文字列は正しいです... あなたの考えをありがとう。 –

+0

*しなければならない...それは長い一日だった。 –