-1

タイマー付きの Windows サービス プログラムがあります。経過したイベントはデフォルトのテストから発生しますが、DB は更新されません。同じ正確なコードが、Windows フォームのボタン クリック イベントで機能します。コードはこちらです。3 層アーキテクチャと sql サーバー 2012 を使用します。

namespace DALStations
{
class GetUpdate
{
    DALConnection connectstring;

    public GetUpdate()
    {
        connectstring = new DALConnection();
    }

             public void  UpdateCommands() //SqlCommand
            {

                SqlCommand authorize = new SqlCommand();

                 authorize.CommandText = "dbo.UpdateTest";
                authorize.CommandType = CommandType.StoredProcedure;
                authorize.Connection = connectstring.GetConnection();


                 authorize.Connection.Open();                    
                authorize.ExecuteNonQuery();

                 authorize.Connection.Close();

            }

}
}

バル

namespace BALStations
{
class BAL
{

    //public void UpdateTest()
    //{
    //    new DALTest().Updatetest();
    //}


    public void CallUpdateProcedure()
    {

        new GetUpdate().UpdateCommands();
    }
  }
}

 Service Layer or UI

namespace Stations
{
public partial class Service1 : ServiceBase
{
    private static System.Timers.Timer aTimer;


      public Service1()
    {
        InitializeComponent();

    }



    protected override void OnStart(string[] args)
    {
        Process();

    }

    public void Process()
    {
        aTimer = new System.Timers.Timer(10000);

        // Hook up the Elapsed event for the timer.
        aTimer.Elapsed += new ElapsedEventHandler(timer1_Elapsed);

        // Set the Interval to 30 seconds (30000 milliseconds).
        aTimer.Interval = 3000;
        aTimer.Enabled = true;

        using (StreamWriter writer = new StreamWriter(@"C:\Users\Joe\Desktop\Summit Works\Authorized Timer\Details.txt", true))
        {
            writer.WriteLine("Service Start {0}", DateTime.Now, true);
        }
        aTimer.Start();
    }

    protected override void OnStop()
    {
        this.timer1.Enabled = false;

    }

    private void timer1_Elapsed(object sender,
 System.Timers.ElapsedEventArgs e)
    {         

       BAL bal = new BAL();
       bal.CallUpdateProcedure(); 

    }     


}
}
4

1 に答える 1

1

権限によるものです。

Windows サービスが実行されている ID は何ですか? また、ストアド プロシージャに対する実行権限はありますか?

サービスに移動し、サービスの ID を確認します。おそらくNETWORK SERVICEまたはとして実行されていますLOCAL SYSTEM

USE MYDatabase
GO

CREATE LOGIN [NT AUTHORITY\NETWORK SERVICE] FROM WINDOWS;
GO

CREATE USER [NETWORK SERVICE] FOR LOGIN [NT AUTHORITY\NETWORK SERVICE]
    WITH DEFAULT_SCHEMA = YourDatabase;
GO

GRANT EXECUTE ON dbo.UpdateTest TO  [NETWORK SERVICE];

dbo ロールに追加することで、「より多くの」権限を付与できます (ただし、このルートをたどることはしません)。

EXEC sp_addrolemember 'dbo', 'NETWORK SERVICE'
于 2013-08-05T02:52:44.810 に答える