SQLXAgent - SQL Express 的作业 - 第 6 部分(共 6 部分)
创建和运行类似 SQL Server Enterprise 的作业 - 有趣的代码。
第 1 部分 - 使用 SQLXAgent
第 2 部分 - 架构和设计决策
第 3 部分 - CSV 和 Excel 导入器代码
第 4 部分 - 作业调度代码
第 5 部分 - 包如何运行
第 6 部分 - 有趣的编码和挑战 (这篇文章)
引言
本文是描述 SQLXAgent 实用程序的更大文章系列的第 6 部分。 在本文中,我将描述一些完成的有趣的编码。 我预计这篇文章不会很长,因为老实说,在为这个文章系列写了五部分之后,我对整个事情有点厌倦了。
注意:文章中提供的代码片段可能并不完全反映代码的最新和最伟大的版本。 如果它与实际代码不完全匹配,它将非常接近。 这就是写文章时注意到问题的性质。
从脚本创建 SQLXAgent 数据库
创建 SQLXAgent 数据库的行为比我预期的需要更多的工作。
发生了什么?
我希望能够在运行脚本时报告进度,这需要一个接口,这意味着负责创建数据库的代码必须是“可通知的”。
为了使“可通知”一词有意义,我不得不将一个大脚本分成 35 个离散的脚本文件。 在测试此代码的过程中,我发现 SQL Server (Express?) 不支持批处理查询中的 GO
语句。 我还发现,通过批处理查询创建存储过程要求 CREATE PROCEDURE
行是可以出现在查询中的第一个非注释行。
运行脚本的行为变得不那么乏味,因为我将它们包含为(非复制)嵌入式资源,因此我可以处理所有处理表的查询,然后通过循环处理存储过程。 这是运行存储过程查询的方法。
/// <summary>
/// Adds the stored procedures to the database one at a time
/// </summary>
private bool AddStoredProcs()
{
bool result = true;
// get a list of all the stored procedure resources
string[] procs = this.assy.GetManifestResourceNames().Where(x=>x.IsLike("%SQLXAgent_SP_%")).ToArray();
// set the appropriate connection string
DBObject2.ConnectionString = this.sqlxConnStr;
// loop through the list of stored proc queries
foreach (string name in procs)
{
// do some completely unnecessary name formatting for the benefit of the UI.
string[] parts = name.Split('.');
string filename = string.Concat(parts[parts.Length-2],'.', parts[parts.Length-1]);
string info = filename.Replace("SQLXAgent_", "").Replace("SP_", "sp_");
// run the sql query
if (!this.RunSQLCommandFromFile(filename, string.Concat("Create proc ",
info.Substring(0, info.IndexOf(".")))))
{
result = false;
break;
}
}
return result;
}
调度时间
当我第一次开始测试调度代码时,我观察到给定作业的每次后续运行将开始在超出预期开始时间几秒钟之后运行。 为了解决这种情况,我在 RunSchedule
方法的开始时重新计算下一次运行时间,同时将秒数清零。
应用程序设置
问题是,我有多个应用程序需要修改在 SQLXAgent 中的某些设置。 解决方案是“映射”SQLXAgent.exe.config
文件,以便我可以从解决方案中的任何应用程序加载它。 这是我使用的代码
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = this.ConfigFile };
this.AppConfig = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
甚至拥有该文件的应用程序 - SQLXAgent - 也使用上面的代码(通过 SQLXAgentSettings 程序集中的静态类方便地提供)。 这使得下游的事情变得简单得多。
XAML 内容
我遇到的最成问题的 XAML 问题是将单选按钮绑定到布尔属性。 在尝试了几次之后(好吧,大约十几下是更准确的数字),我发现了这个 CodeProject 技巧/窍门
将单选按钮绑定到单个属性,作者是 Volodymyr Trubachov。
历史
- 2017 年 9 月 29 日 - 首次发布。