簡體   English   中英

如何從 Windows 服務訪問 SQL 數據庫?

[英]How to access a SQL database from a Windows service?

我正在嘗試為 Windows 10(64 位)開發一個 Windows 服務,它打算定期在本地 MS SQL Server(v.11)中插入記錄。

它安裝並運行成功,但沒有插入任何記錄。 我嘗試了System.Timers.TimerSystem.Threading.Timer

我還嘗試在服務啟動事件上插入。 但這也不起作用。

這是我的代碼:

public partial class Service1 : ServiceBase
{
    // System.Timers.Timer timer;
    System.Threading.Timer threadTimer;
   
    public Service1()
    {
        InitializeComponent();
    }


    //UPDATE: I checked the following method code in a console application. It works fine.
    private void InsertRecord()
    {
        try
        {
            using (SqlConnection connection = new SqlConnection("Server=.;Database=TestDb; Trusted_Connection=True;"))
            {
                using (SqlCommand command = new SqlCommand())
                {
                    command.Connection = connection;
                    command.CommandText = "Insert into .....')";
                    connection.Open();
                    command.ExecuteNonQuery();
                    connection.Close();
                }
            }
        }
        catch (Exception ex)
        {
        }
    }

    protected override void OnStart(string[] args)
    {
        InsertRecord(); //This line not executed also.

        TimeSpan tsInterval = new TimeSpan(0, 2, 0); //2 minute interval.
        threadTimer = new Timer(new TimerCallback(threadTimer_Elapsed)
            , null, tsInterval, tsInterval);


        //timer = new System.Timers.Timer();
        //timer.Interval = 10000;
        //timer.Elapsed += Timer_Elapsed;
        //timer.Enabled = true;
        //timer.Start();
    }

    private void threadTimer_Elapsed(object state)
    {
         InsertRecord();
    }

    //private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    //{
    //      InsertRecord()
    //}

    protected override void OnStop()
    {
        threadTimer.Change(Timeout.Infinite, Timeout.Infinite);
        threadTimer.Dispose();
        threadTimer = null;

        //timer.Stop();
    }
}

我在這里錯過了什么?

在您的 SQL Server 中,允許 NT AUTHORITY/SYSTEM 以 sysadmin 身份服務 Role。

按照屏幕截圖-

在此處輸入圖片說明

在此處輸入圖片說明

更改服務上的運行方式設置以作為您自己的個人帳戶運行。 這將提供與您的控制台測試相同的安全環境。 這將允許服務權限登錄到 SQL Server。

然后將服務更改為“本地系統”或類似服務,它將失敗 - 您需要授予“本地系統”訪問數據庫的權限。

此外 - 一個空的 Catch 塊是您發布到 SO 的原因 - 如果您編寫了最簡單的錯誤處理程序和記錄器,您將得到答案。

您沒有提供有關連接字符串的大量信息,但正如@NightOwl888 指出的那樣,問題可能與您使用Trusted_Connection=True 有關

如果您使用 Sql 身份驗證(而不是 Windows 身份驗證)連接到 Sql 服務器,我相信您需要設置Trusted_Connection=False

這應該允許使用您的連接字符串憑據(而不是機器名稱/Windows 服務帳戶/等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM