Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中以编程方式运行SQL Server作业?_C#_Sql Server_Database - Fatal编程技术网

如何在C#中以编程方式运行SQL Server作业?

如何在C#中以编程方式运行SQL Server作业?,c#,sql-server,database,C#,Sql Server,Database,在SQLServerManagementStudio中,对象资源管理器中列出的不仅仅是数据库。在SQLServer代理下,我们有“作业”。我们拥有的其中一个作业将更新客户端以匹配缓存。这一点很重要,因为我们的缓存系统是如何工作的。如果对数据库进行更改,则运行此作业时不会反映更改 因此,在C#代码中,有时我对数据库表进行更改,之后需要运行此作业。在SQLServerManagementStudio中很容易做到这一点。我只需右键单击作业,然后单击“在步骤中启动作业…”,但如何在C#中执行相同的操作

在SQLServerManagementStudio中,对象资源管理器中列出的不仅仅是数据库。在SQLServer代理下,我们有“作业”。我们拥有的其中一个作业将更新客户端以匹配缓存。这一点很重要,因为我们的缓存系统是如何工作的。如果对数据库进行更改,则运行此作业时不会反映更改

因此,在C#代码中,有时我对数据库表进行更改,之后需要运行此作业。在SQLServerManagementStudio中很容易做到这一点。我只需右键单击作业,然后单击“在步骤中启动作业…”,但如何在C#中执行相同的操作

我一直遇到的问题没有在可能是重复的帖子中得到回答。命令行是“execute msdb.dbo.sp_start_job@job_name='Update Client Matching Cache'”,虽然我有权限从SQL行运行此命令(因此显示我有权限),但我无法从代码中运行它。将作业名称“更新客户端匹配缓存”传递到此过程失败:

  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();