- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 SQL Server CLR 中运行我的代码:
[SqlProcedure]
private static int RunExecutable()
{
SqlDataRecord sqlDataRecord = new SqlDataRecord(new SqlMetaData("message", SqlDbType.NVarChar, 1L));
SqlContext.Pipe.SendResultsStart(sqlDataRecord);
int lineCount = 0;
Process process = new Process();
process.StartInfo.FileName = "ipconfig.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.EnableRaisingEvents = true;
process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
{
sqlDataRecord.SetString(0, "OnDataReceived");
SqlContext.Pipe.SendResultsRow(sqlDataRecord);
if (!String.IsNullOrEmpty(e.Data))
{
lineCount++;
sqlDataRecord.SetString(0, "[" + lineCount + "]: " + e.Data);
SqlContext.Pipe.SendResultsRow(sqlDataRecord);
}
});
process.Start();
process.BeginOutputReadLine();
while (!process.HasExited)
{
sqlDataRecord.SetString(0, "process WaitForExit ");
SqlContext.Pipe.SendResultsRow(sqlDataRecord);
process.WaitForExit(300);
}
}
和 ipconfig.exe
运行(我在结果中看到“process WaitForExit”),但未触发 OutputDataReceived
事件。
该程序集是在 SQL Server 2019 Enterprise 中使用 PERMISSION_SET = UNSAFE;
创建的。如果我运行与标准控制台应用程序相同的代码,一切正常
最佳答案
当您在 WaitForExit
上阻塞 session 线程时,这将需要一个后台线程来运行事件。我对它在 SQLCLR 中不起作用并不感到惊讶,它是一个与控制台应用程序截然不同的 .NET Framework 宿主。
即使事件触发,您也无法从调用该方法的线程以外的线程访问 SqlContext.Pipe
。
改为使用调用您的方法的线程执行 StandardOutput 的阻塞读取,如下所示:
static IEnumerable<string> GetOutputLines(string exeName, string args = null)
{
Process process = new Process();
process.StartInfo.FileName = exeName;
process.StartInfo.Arguments = args;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.EnableRaisingEvents = true;
process.Start();
while ( true )
{
var line = process.StandardOutput.ReadLine();
if (line == null)
break;
yield return line;
}
process.WaitForExit();
}
关于c# - 在 SQL Server CLR 存储过程中运行进程但 Process.OutputDataReceived 未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67202368/
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我有一个 ChildProcessMonitor 类,它启动我的进程,报告收到的数据并在进程退出时重新启动该进程。我的问题是,一旦进程退出并再次调用 Start,就不再报告输出。 using Syst
我有一个方法可以创建调用控制台应用程序的进程。 double myProcess() { double results; Process process = new Process()
我有一个多线程 winforms 应用程序。一个线程用于 GUI,一个线程用于后台处理。在后台处理中,我通过 Process 类与外部进程通信以发送接收数据。 我对注册 Process.OutputD
我在一个针对 .Net Framework 3.5 的程序中有一个 System.Diagnostics.Process 对象 我已经重定向了 StandardOutput 和 StandardErr
我正在尝试“实时”(在运行时)捕获流程输出。我使用的代码相当简单(见下文)。由于某些奇怪的原因,永远不会调用 OutputDataReceived 事件。为什么? private void butto
我确实遇到了一个奇怪的问题:我尝试调用 git.exe 以通过小型 c# console-application-> 克隆存储库 Process p = new Process(); p.StartI
以下问题发生在 .NET Framework v3.5 上。不知道它是否适用于 v4*。 为了捕获某些进程的标准输出,我已成功使用 p.StartInfo.UseShellExecute = fals
有没有办法提高 .NET 中的 Process 对象抛出 OutputDataReceived 事件的速率?它创建了一个大缓冲区(我相信有 1024 个字符),该缓冲区被批量转储,这使得应用程序不像我
我想在 SQL Server CLR 中运行我的代码: [SqlProcedure] private static int RunExecutable() { SqlDataRecord s
我是一名优秀的程序员,十分优秀!