gpt4 book ai didi

c# - 在 SQL Server CLR 存储过程中运行进程但 Process.OutputDataReceived 未触发

转载 作者:行者123 更新时间:2023-12-04 14:59:45 25 4
gpt4 key购买 nike

我想在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com