gpt4 book ai didi

c# - SQLCLR 似乎没有启动 Windows 应用程序

转载 作者:太空宇宙 更新时间:2023-11-03 22:30:08 25 4
gpt4 key购买 nike

我正在尝试使用 SQLCLR 从 SQL Server 启动 Windows 程序。调用的过程没有报错,但是程序好像没有启动。

知道我可能做错了什么吗?

这是我的程序的 .NET 代码:

using System;
using Microsoft.SqlServer.Server;
using System.Diagnostics;

namespace MyUtility
{
public class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void MyUtilityExecute()
{
string result;

try
{
Process myProcess = new Process();
myProcess.StartInfo.FileName = "C:\\Windows\\System32\\notepad.exe";
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.CreateNoWindow = false;
myProcess.Start();

result = "Success! Time = "
+ DateTime.Now.ToString("dddd, dd MMMM yyyy HH:mm:ss");
SqlContext.Pipe.Send(result);
}
catch
{
result = "There was an error!";
SqlContext.Pipe.Send(result);
}
}
}
}

这是我创建程序集和包装器对象的 T-SQL 代码:

USE [MyDatabase]
GO

CREATE ASSEMBLY MyUtility
AUTHORIZATION [dbo]
FROM 'C:\MyPath\MyUtility\bin\Debug\MyUtility.dll'
WITH PERMISSION_SET = UNSAFE
GO

CREATE PROCEDURE usp_MyUtilityExecute
AS EXTERNAL NAME
MyUtility.[MyUtility.StoredProcedures].MyUtilityExecute
GO

EXECUTE usp_MyUtilityExecute;

最佳答案

您是否检查了任务管理器、进程资源管理器或任何其他查看本地进程的方式来确定程序是否真正启动?我敢打赌它做到了。问题是 SQL Server 是一个完全独立于您的 (Windows) 用户 session 的后台进程,并且无法访问您的桌面(即使 SQL Server 在您登录的同一台计算机上运行,​​而且它经常实际运行在您仅向其发送请求的另一台计算机上,就像网站是远程的一样)。您会看到 GUI 应用程序或窗口的唯一方法是使用 SQL Server Express LocalDB,因为这是一个用户模式进程,在您的 session 中作为后台进程运行,并且它确实可以访问您的桌面。所以,notepad 应该正在运行,只是您看不到它。如果你继续执行这个存储过程,你可能每次都会产生一个新的、单独的 notepad 进程。你可能想杀死那些 ;-).

如果您想测试 SQL Server 是否真的可以生成基于操作系统的进程/应用程序,只需在 C:\temp 中创建一个简单的 .cmd 脚本执行以下操作:

ECHO %TIME% >> C:\TEMP\_SQLCLR_test.txt

然后将第一个 StartInfo 行更改为:

myProcess.StartInfo.FileName = @"C:\TEMP\_SQLCLR_test.cmd";

也许还有:

myProcess.StartInfo.CreateNoWindow = true;

这将在不需要 UI 交互的情况下测试整体概念(假设运行 SQL Server 进程的登录帐户有权访问和写入/修改 C:\TEMP 目录)。

!!重要提示!!

Process 是一次性对象,因此需要在 using() 构造中创建,或者您需要实现 try/finally 管理它调用 Dispose() 而不管发生什么。在您当前的设置中,如果出现异常,您将拥有一个孤立的外部资源,它将保留内存/文件系统句柄等,直到垃圾被收集,并且不确定何时会发生,因为我不相信 SQL Server 会调用经常这样。

关于c# - SQLCLR 似乎没有启动 Windows 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58335446/

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