SQLCLR не появляется для запуска приложения Windows - PullRequest
1 голос
/ 11 октября 2019

Я пытаюсь запустить программу Windows из SQL Server, используя SQLCLR. Вызванная процедура не является ошибкой, но программа не запускается.

Есть идеи, что я могу делать неправильно?

Вот мой код .NET для процедуры:

using System;
using Microsoft.SqlServer.Server;
using System.Diagnostics;

namespace MyUtility
{
    public class StoredProcedures
    {
        [Microsoft.SqlServer.Server.SqlProcedure]
        public static void MyUtilityExecute()
        {
            string result;

            try
            {
                Process myProcess = new Process();
                myProcess.StartInfo.FileName = "C:\\Windows\\System32\\notepad.exe";
                myProcess.StartInfo.UseShellExecute = false;
                myProcess.StartInfo.CreateNoWindow = false;
                myProcess.Start();

                result = "Success! Time = "
                        + DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss");
                SqlContext.Pipe.Send(result);
            }
            catch
            {
                result = "There was an error!";
                SqlContext.Pipe.Send(result);
            }
        }
    }
}

Вот мой код T-SQL для создания объекта сборки и оболочки:

USE [MyDatabase]
GO

CREATE ASSEMBLY MyUtility
AUTHORIZATION [dbo]
FROM 'C:\MyPath\MyUtility\bin\Debug\MyUtility.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE PROCEDURE usp_MyUtilityExecute
AS EXTERNAL NAME 
    MyUtility.[MyUtility.StoredProcedures].MyUtilityExecute
GO

EXECUTE usp_MyUtilityExecute;

1 Ответ

3 голосов
/ 11 октября 2019

Проверяли ли вы Диспетчер задач, Обозреватель процессов или любой другой способ просмотра локальных процессов, чтобы определить, действительно ли программа запущена? Могу поспорить, что сделал. Проблема заключается в том, что SQL Server является совершенно отдельным фоновым процессом от вашего (Windows) пользовательского сеанса и не имеет доступа к вашему рабочему столу (даже если SQL Server работает на том же компьютере, на котором вы вошли, и довольно часто он фактически выполняетсяна другом компьютере, на который вы просто отправляете запросы, как удаленные веб-сайты). Единственный способ увидеть приложение или окно с графическим интерфейсом - это использовать SQL Server Express LocalDB, поскольку это процесс пользовательского режима, который выполняется в сеансе как фоновый процесс и имеет доступ к вашему рабочему столу. Итак, блокнот должен быть запущен, вы просто его не видите. И если вы продолжите выполнять эту хранимую процедуру, вы, скорее всего, будете порождать новый отдельный блокнот каждый раз. Возможно, вы захотите убить их; -).

Если вы хотите проверить, действительно ли SQL Server может порождать процесс / приложение на базе ОС, просто создайте простой .cmd скрипт на C:\temp, которыйвыполняет следующие действия:

ECHO %TIME% >> C:\TEMP\_SQLCLR_test.txt

Затем измените первую строку StartInfo на:

myProcess.StartInfo.FileName = @"C:\TEMP\_SQLCLR_test.cmd";

и, возможно, также:

myProcess.StartInfo.CreateNoWindow = true;

. общая концепция, не требующая взаимодействия с пользовательским интерфейсом (при условии, что учетная запись входа, на которой запущен процесс SQL Server, имеет разрешения на доступ и запись / изменение в каталог C: \ TEMP ).

!! ВАЖНОЕ ПРИМЕЧАНИЕ !!

Process - это одноразовый объект, поэтому его необходимо создать в конструкции using(), либо вам необходимо реализовать try / finallyуправлять этим звонком Dispose() независимо от того, что происходит. В вашей текущей настройке, если есть исключение, у вас будет потерянный внешний ресурс, который будет хранить память / файловую систему / etc до тех пор, пока не будет собран мусор, и не уверен, когда это произойдет, поскольку я не верю, что вызовы SQL Serverэто очень часто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...