gpt4 book ai didi

c# - C#中如何判断SQL作业是否执行成功

转载 作者:太空狗 更新时间:2023-10-30 00:50:33 25 4
gpt4 key购买 nike

我有一个 C# 方法来执行 SQL 作业。它成功执行了 SQL 作业。代码运行完美。

为此,我正在使用标准 SQL 存储过程 msdb.dbo.sp_start_job

这是我的代码..

public int ExcecuteNonquery()
{
var result = 0;
using (var execJob =new SqlCommand())
{
execJob.CommandType = CommandType.StoredProcedure;
execJob.CommandText = "msdb.dbo.sp_start_job";
execJob.Parameters.AddWithValue("@job_name", "myjobname");
using (_sqlConnection)
{
if (_sqlConnection.State == ConnectionState.Closed)
_sqlConnection.Open();

sqlCommand.Connection = _sqlConnection;
result = sqlCommand.ExecuteNonQuery();

if (_sqlConnection.State == ConnectionState.Open)
_sqlConnection.Close();
}
}
return result;
}

这是在作业中执行的sp

ALTER PROCEDURE [Area1].[Transformation]
AS
BEGIN
SET NOCOUNT ON;

SELECT NEXT VALUE FOR SQ_COMMON
-- Transform Master Data
exec [dbo].[sp_Transform_Address];
exec [dbo].[sp_Transform_Location];
exec [dbo].[sp_Transform_Product];
exec [dbo].[sp_Transform_Supplier];
exec [dbo].[sp_Transform_SupplierLocation];

-- Generate Hierarchies and Product References
exec [dbo].[sp_Generate_HierarchyObject] 'Area1',FGDemand,1;
exec [dbo].[sp_Generate_HierarchyObject] 'Area1',RMDemand,2;
exec [dbo].[sp_Generate_Hierarchy] 'Area1',FGDemand,1;
exec [dbo].[sp_Generate_Hierarchy] 'Area1',RMDemand,2;
exec [dbo].[sp_Generate_ProductReference] 'Area1',FGDemand,1;
exec [dbo].[sp_Generate_ProductReference] 'Area1',RMDemand,2;

-- Transform Demand Allocation BOM
exec [Area1].[sp_Transform_FGDemand];
exec [Area1].[sp_Transform_FGAllocation];
exec [Area1].[sp_Transform_RMDemand];
exec [Area1].[sp_Transform_RMAllocation];
exec [Area1].[sp_Transform_BOM];
exec [Area1].[sp_Transform_RMDemand_FK];

-- Transform Purchasing Document Data
exec [dbo].[sp_Transform_PurchasingDoc];
exec [dbo].[sp_Transform_PurchasingItem];
exec [dbo].[sp_Transform_ScheduleLine];


exec [dbo].[sp_CalculateRequirement] 'Area1'
exec [dbo].[sp_Create_TransformationSummary] 'Area1'
-- Trauncate Integration Tables
exec [dbo].[sp_TruncateIntegrationTables] 'Area1'

END

问题是,无论作业执行成功与否,它总是返回-1。如何确定作业是否成功执行。

最佳答案

运行 msdb.dbo.sp_start_job 后,返回代码映射到输出参数。您有机会控制参数的名称​​在执行之前:

public int StartMyJob( string connectionString )
{
using (var sqlConnection = new SqlConnection( connectionString ) )
{
sqlConnection.Open( );
using (var execJob = sqlConnection.CreateCommand( ) )
{
execJob.CommandType = CommandType.StoredProcedure;
execJob.CommandText = "msdb.dbo.sp_start_job";
execJob.Parameters.AddWithValue("@job_name", "myjobname");
execJob.Parameters.Add( "@results", SqlDbType.Int ).Direction = ParameterDirection.ReturnValue;
execJob.ExecuteNonQuery();
return ( int ) sqlCommand.Parameters["results"].Value;
}
}
}

您需要知道返回代码的数据类型才能执行此操作 - 对于 sp_start_job,它是 SqlDbType.Int

然而,这只是开始工作的结果,这值得了解,而不是运行您的工作的结果。要运行您的作业的结果,您可以定期执行:

msdb.dbo.sp_help_job @jobName

该过程返回的列之一是 last_run_outcome,可能包含您真正感兴趣的内容。它仍在运行时将为 5(未知)。

作业通常由多个步骤组成 - 其中每个步骤可能会或可能不会根据先前步骤的结果执行。另一个名为 sp_help_jobhistory 的过程支持大量过滤器以指定您感兴趣的作业的哪些特定调用和/或步骤。

SQL 喜欢将作业视为计划工作 - 但没有什么可以阻止您开始临时作业 - 尽管它并没有真正为您提供太多支持将您的临时作业与实例相关联工作经历。日期几乎是最好的(除非有人知道我不知道的技巧。)

我已经看到作业是在运行之前创建的临时作业,因此当前的临时执行是唯一返回的执行。但是你最终会得到很多重复或接近重复的工作,这些工作永远不会再次执行。如果你走那条路,你必须计划事后清理。

关于您使用 _sqlConnection 变量的说明。你不想那样做。您的代码处理了它,但它显然是在调用此方法之前在其他地方创建的。那是糟糕的 juju。您最好只创建连接并以相同的方法处理它。依靠 SQL 连接池来加快连接速度 - 这可能已经开启。

此外 - 在您发布的代码中 - 看起来您从 execJob 开始但切换到 sqlCommand - 有点搞砸了编辑。我一直以为您指的是 execJob - 这在示例中有所反射(reflect)。

关于c# - C#中如何判断SQL作业是否执行成功,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31337492/

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