如何在C#中以编程方式运行SQL Server作业?
在SQLServerManagementStudio中,对象资源管理器中列出的不仅仅是数据库。在SQLServer代理下,我们有“作业”。我们拥有的其中一个作业将更新客户端以匹配缓存。这一点很重要,因为我们的缓存系统是如何工作的。如果对数据库进行更改,则运行此作业时不会反映更改 因此,在C#代码中,有时我对数据库表进行更改,之后需要运行此作业。在SQLServerManagementStudio中很容易做到这一点。我只需右键单击作业,然后单击“在步骤中启动作业…”,但如何在C#中执行相同的操作 我一直遇到的问题没有在可能是重复的帖子中得到回答。命令行是“execute msdb.dbo.sp_start_job@job_name='Update Client Matching Cache'”,虽然我有权限从SQL行运行此命令(因此显示我有权限),但我无法从代码中运行它。将作业名称“更新客户端匹配缓存”传递到此过程失败:如何在C#中以编程方式运行SQL Server作业?,c#,sql-server,database,C#,Sql Server,Database,在SQLServerManagementStudio中,对象资源管理器中列出的不仅仅是数据库。在SQLServer代理下,我们有“作业”。我们拥有的其中一个作业将更新客户端以匹配缓存。这一点很重要,因为我们的缓存系统是如何工作的。如果对数据库进行更改,则运行此作业时不会反映更改 因此,在C#代码中,有时我对数据库表进行更改,之后需要运行此作业。在SQLServerManagementStudio中很容易做到这一点。我只需右键单击作业,然后单击“在步骤中启动作业…”,但如何在C#中执行相同的操作
public static void RunStoredProcedure(string strSQLJob)
{
SqlCommand ExecJob = new SqlCommand();
ExecJob.CommandType = CommandType.StoredProcedure;
ExecJob.CommandText = "msdb.dbo.sp_start_job";
ExecJob.Parameters.AddWithValue("@job_name", strSQLJob);
using (SqlConnection sc = DatabaseManager.SqlConnection())
{
sc.Open();
using (ExecJob)
{
ExecJob.Connection = sc;
ExecJob.ExecuteNonQuery();
}
}
}
错误是:System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理
其他信息:对对象“sp_start_job”、数据库“msdb”、架构“dbo”的执行权限被拒绝
如果在管理模式下打开Visual Studio,也会出现相同的错误。您需要使用名称空间..在这个名称空间中,您有一个has方法。下面是..中的一些示例代码
您需要使用名称空间..在这个名称空间中,您有一个has方法
您可以创建一个新作业和一个新的“任务”表 新作业将每隔5分钟左右检查“任务”表的状态。如果该表中有一个状态为“待定”的新行,则该作业将启动目标作业,并将状态更改为“进行中”
最后,最后一个作业可以包含一个步骤,在完成后将状态再次更改为“成功”或“失败”。您可以创建一个新作业和一个新的“任务”表 新作业将每隔5分钟左右检查“任务”表的状态。如果该表中有一个状态为“待定”的新行,则该作业将启动目标作业,并将状态更改为“进行中”
最后,最后一个作业可以包括一个步骤,在完成后将状态再次更改为“成功”或“失败”。在类似问题中使用答案几乎可以在抛出权限错误的情况下工作在类似问题中使用答案几乎可以在抛出权限错误的情况下工作。。tsql启动作业并遇到问题。这将基本上开始一项工作。。。我甚至不知道为什么这是一个问题。如果这是一个sql命令,它在查询中失败。错误是:“找不到存储过程'sp_start_job'”。您使用的是什么版本的SQL Server?请尝试
执行msdb.dbo.sp_start_job@job_name='[此处的作业名称]'
Igor,我可以从SQL查询命令行运行此操作,但我在C中遇到权限冲突,所以我用谷歌搜索。。tsql启动作业并遇到问题。这将基本上开始一项工作。。。我甚至不知道为什么这是一个问题。如果这是一个sql命令,它在查询中失败。错误是:“找不到存储过程'sp_start_job'”,您使用的是哪个版本的SQL Server?请尝试执行msdb.dbo.sp_start_job@job_name='[job name HERE]'
Igor,我可以从SQL查询命令行运行此操作,但顺便说一句,我在引用C中遇到了权限冲突,是Microsoft.SqlServer.Smo.dll文件的引用,顺便说一下,是Microsoft.SqlServer.Smo.dll文件的引用。现在看起来好多了。谢谢你,蒂姆。现在看起来好多了。
Server srv = new Server("(local)");
Job jb = new Job(srv.JobServer, "Test Job");
jb.Create();
JobStep jbstp = new JobStep(jb, "Test Job Step");
jbstp.OnSuccessAction = StepCompletionAction.QuitWithSuccess;
jbstp.OnFailAction = StepCompletionAction.QuitWithFailure;
jbstp.Create();
jb.ApplyToTargetServer(srv);
jb.IsEnabled = true;
jb.Invoke();