SQL CLR вызывает Process.Start зависает или не работает - PullRequest
0 голосов
/ 06 марта 2019

Я проверил, и есть много похожих сообщений, но я не могу решить эту проблему. Это процедура SQL CLR для запуска exe-файла, который анализирует PDF-файлы. Я могу запустить тот же код, что и я, в консольном приложении. Разрешения не проблема. Я дамп в журнал событий, и ProcessStartInfo полностью сформирован. UseShellExecute - я не уверен. Я также создал файл .bat для выполнения кода - запустите его вручную - он работает нормально. Через эту программу CLR? Висит или убегает сразу, но ничего не делает. В конце концов. Моя цель состояла в том, чтобы создать CLR, используя Nuget из itext, но мне было очень трудно установить. SQL CLR не поддерживает, но я все равно попробовал.

Заранее спасибо.

[Microsoft.SqlServer.Server.SqlProcedure]
    public static void PDFToCSVViaExe_CLR()
    {

        ProcessStartInfo startInfo = new ProcessStartInfo();
        string args = @"\\app\Systems\Universal";
        args = " \"" + args + "\"" + " \"" + "*" + "\"" + " \"" + "LVM" + "\"";
        startInfo.CreateNoWindow = false;
        startInfo.UseShellExecute = true;
        startInfo.FileName = "c:\\SqlCLR\\PDFRipper\\PDFToCSV.exe";
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;
        startInfo.Arguments = args;
        EventLog.WriteEntry(".NET Runtime", startInfo.FileName.ToString()+" " + args, EventLogEntryType.Warning, 1000);

        string folder = "C:\\SqlCLR\\PDFRipper\\LVM.bat";
        try
        {
            //using (new ImpersonationNamespace.Impersonation("domain", "user", "password"))
            {
                EventLog.WriteEntry(".NET Runtime", System.Security.Principal.WindowsIdentity.GetCurrent().Name + " OR " + Environment.UserName, EventLogEntryType.Warning, 1000);
                folder = System.IO.Path.GetDirectoryName(folder);
                if (!Directory.Exists(folder))
                {
                    throw (new Exception("Directory does not exist for " + folder));
                }
                else
                { EventLog.WriteEntry(".NET Runtime", folder + " exists.", EventLogEntryType.Warning, 1000); }
                // Start the process with the info we specified.
                // Call WaitForExit and then the using statement will close.
                using (Process exeProcess = Process.Start(startInfo))
                {
                    exeProcess.WaitForExit();
                }

            }

        }
        catch (Exception ex)
        {
            using (EventLog EventLog = new EventLog("Application"))
            {
                EventLog.Source = "Application";
                //eventLog.WriteEntry(ex.Message);
                EventLog.WriteEntry(".NET Runtime", ex.Message + "Trace" + ex.StackTrace, EventLogEntryType.Warning, 1000);
                //eventLog.WriteEntry(".NET Runtime", ex.Message, EventLogEntryType.Warning, 1000);
            }

        }
...