【发布时间】:2021-07-16 00:48:05
【问题描述】:
我想在我的代码中在 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 运行(我在结果中看到“进程WaitForExit”),但未触发OutputDataReceived 事件。
程序集是在 SQL Server 2019 Enterprise 中使用PERMISSION_SET = UNSAFE; 创建的。如果我运行与标准控制台应用程序相同的代码,一切正常
【问题讨论】:
-
你考虑过使用
Ping.Send吗?顺便说一句,您应该使用using块处理process
标签: c# sql-server sqlclr