假设我想从Sql Server中运行的SqlClr存储过程调用32位可执行命令,使用类似下面的代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Diagnostics;
using System.Text;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void ecommerce_export_cmd(SqlString directoryPath,
SqlString execName,
SqlString arguments)
{
// Make sure the file exists
string fullPath = Path.Combine(directoryPath.Value, execName.Value);
FileInfo fi = new FileInfo(fullPath);
if (!fi.Exists)
{
using (SqlCommand cmd = new SqlCommand())
{
cmd.CommandText = string.Format(
"raiserror('File ->{0}<- is not found.',16,1)",
execName.Value);
try { SqlContext.Pipe.ExecuteAndSend(cmd); }
catch { return; }
}
}
// ProcessStartInfo to run the DOS command attrib
ProcessStartInfo pInfo = new ProcessStartInfo("cmd.exe");
pInfo.WorkingDirectory = directoryPath.Value;
pInfo.UseShellExecute = true;
// quote the arguments in case it has spaces
pInfo.Arguments = string.Format("{0} {1}", execName.Value, arguments.Value);
// Start a new process and wait for it to exit
Process process = new Process();
process.StartInfo = pInfo;
process.Start();
process.WaitForExit();
}
}
考虑到SqlServer是一个64位进程,给定上面的代码,我应该 期望由于不同的位数导致的潜在问题?我当然不想要 崩溃SqlServer。
答案 0 :(得分:1)
我希望如果有问题会通过错误消息指出。一般来说,我不认为您应该担心这一点,因为您启动的任何进程都不是SQL Server的一部分(因此只有在程序集标记为UNSAFE
时才可能)。
实际上, cmd.exe 是一个64位应用,在使用{{{{>>时,您不需要首先执行 cmd.exe 1}},你可以执行命令或应用程序。 CMD 是一个shell,使用UseShellExecute = true
创建新流程已调用 cmd.exe 。