SQL CLR调用Process.Start挂起或失败

时间:2019-03-05 21:44:36

标签: c# sql clr process.start

我已经检查过,并且有很多类似的帖子,但我无法解决。这是一个SQL CLR proc,用于运行解析PDF文件的exe。我可以在控制台应用程序中运行与自己相同的代码。权限不是问题。我正在转储到事件日志,并且ProcessStartInfo已完全形成。 UseShellExecute-我不确定。我还创建了一个.bat文件来执行代码-手动运行-运行正常。通过这个CLR程序?立即挂起或运行,但不执行任何操作。机智。我的目标是使用来自itext的Nuget创建CLR,但是安装起来确实很困难。 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);
            }

        }

0 个答案:

没有答案