删除维护计划时报错:索引超出范围必 须为⾮负值并⼩于集合⼤⼩

在尝试删除SQLServer2016的维护计划时遇到错误,由于外键约束FK_subplan_job_id导致删除失败。为了解决这个问题,需要手动删除相关联的日志、子计划和作业。提供的解决方案包括删除sysmaintplan_log、sysjobschedules、sysmaintplan_subplans中的记录,然后删除作业。

问题:删除维护计划时报错:索引超出范围必 须为⾮负值并⼩于集合⼤⼩

在SQL Server 2016上删除已运行维护计划后,维护计划job没有自动删除掉,手工再删除维护计划job,提示删除失败。

错误现象:delete  语句与 reference 约束"FK_subplan_job_id"冲突。该冲突发生于数据库"msdb",表"dbo.sysmaintplan_subplans", column 'job_id'。语句已终止。 (Microsoft SQL Server,错误: 547)

原因分析:

从错误信息我们可以看出是删除某个系统表中记录时,由于外键约束关系,导致删除失败。最后导致存储过程msdb.dbo.sp_delete_job执行失败。

解决方案:

use [msdb]

declare @job_name varchar(100)

set @job_name = N'job_name'

--注:job_name为维护计划对应的job name

--删除在计划里面的日志

delete sysmaintplan_log from  sysmaintplan_subplans as subplans

 inner  join sysjobs_view as syjobs on subplans.job_id = syjobs.job_id

 inner  join sysmaintplan_log on  subplans.subplan_id =sysmaintplan_log.subplan_id

where (syjobs.name = @job_name)

--删除代理的作业

delete  sysjobschedules from  sysjobs_view v 

inner join  sysjobschedules o on  v.job_id=o.job_id  where  v.name=@job_name

--删除子计划

delete  sysmaintplan_subplans from  sysmaintplan_subplans  as subplans

inner join sysjobs_view as  syjobs  on subplans.job_id = syjobs.job_id

where  (syjobs.name = @job_name)

--删除作业

delete from  msdb.dbo.sysjobs_view where name = @job_name

<think>好的,我现在需要解决用户提到的在设置`checkedComboBoxEdit_lotlist.Properties.AllowMultiSelect = true;`出现的“索引超出范围”错误。首先,我需要回顾一下之前的对话历史,看看用户之前的问题和我的回答,确保理解上下文。 用户之前的问题是关于如何正确绑定`CheckedComboBoxEdit`控件,因为之前尝试使用`DataSource`绑定显示不正确。我建议他们手动添加Items到`Properties.Items`集合中,而不是使用数据绑定。现在用户遇到了在设置`AllowMultiSelect`属性出现索引超出范围的错误。 首先,我需要分析错误的原因。这个错误通常发生在访问集合中的某个索引,该索引不存在。可能的情况是,当用户尝试设置`AllowMultiSelect`为true,控件内部试图访问Items集合中的某个项,但此Items集合可能为空或者未正确初始化,导致索引越界。 接下来,我需要检查用户提供的代码。用户当前的`CheckLotList`方法中,首先清空Items,然后从DataTable中读取数据逐个添加到Items集合中。然后设置`AllowMultiSelect = true`。但错误发生在设置这个属性,说明可能在设置这个属性的候,控件内部某些操作触发了对Items集合的访问,而此Items可能还未被填充,或者存在其他问题。 另一个可能性是,用户可能在控件未正确初始化之前就设置了`AllowMultiSelect`属性。例如,如果在控件的构造阶段或者加载阶段过早设置该属性,可能导致控件内部逻辑出现问题。 此外,我需要考虑DevExpress的`CheckedComboBoxEdit`控件的行为。根据文档,`AllowMultiSelect`属性控制是否允许多选。当设置为true,控件可能需要初始化多选相关的UI元素,这可能涉及到Items集合的访问。如果此Items集合为空或者未正确设置,可能导致索引越界。 可能的解决方案包括: 1. 确保在设置`AllowMultiSelect`之前,Items集合已经被正确填充。用户当前的代码是在添加完Items之后设置该属性,所以理论上顺序是正确的。但需要确认是否有其他地方在调用过程中修改了Items集合或触发了控件的刷新。 2. 检查是否在控件的Items集合中存在无效项或重复项,导致控件在初始化出错。例如,如果DataTable中有null值或者异常数据,可能导致Items添加出现问题。 3. 确保`checkedComboBoxEdit_lotlist`控件在设置属性已经正确初始化。例如,在窗体加载,控件可能尚未完全加载,导致属性设置失败。 4. 使用DevExpress的`RepositoryItemCheckedComboBoxEdit`来配置属性,而不是直接操作控件的Properties。这可能需要更复杂的配置,但可能更稳定。 5. 捕获异常查看具体的堆栈跟踪,确定错误发生的确切位置。用户可能需要在代码中添加try-catch块,捕获异常输出详细信息,以帮助诊断问题。 现在,我需要将这些思路整理成一个清晰的步骤,给出修正后的代码示例,同确保用户理解错误的原因以及如何避免类似问题。 另外,用户提到在之前的代码中,他们使用`Properties.Items.Clear()`和逐个添加项,但可能在某些情况下,Items集合的大小在设置AllowMultiSelect被访问,导致索引越界。例如,如果控件在设置AllowMultiSelect尝试访问第一个项(索引0),但此Items集合为空,就会抛出此异常。 因此,正确的做法可能是确保在设置AllowMultiSelect之前,Items集合已经填充完毕,且在设置AllowMultiSelect之后,控件不会立即访问Items中的项。或者,可能需要延迟设置AllowMultiSelect属性,直到数据加载完成。 最后,我需要验证这些假设,给出具体的代码修改建议,以及相关的问题供用户进一步了解。</think>这是因为 `AllowMultiSelect` 属性的设置机与 `Items` 集合的填充顺序存在冲突。当 `Items` 为空直接设置多选模式会触发控件内部对集合的访问,导致索引越界。以下是修正后的代码: ```csharp private void CheckLotList() { using (OracleConnection connection = new OracleConnection(DBConnector.DBConnector.GetYMSDBString())) { string sql = @" SELECT DISTINCT t.lotid FROM ESPT_NTO_LOT_FORECASTTIME t"; using (OracleCommand command = new OracleCommand(sql, connection)) { connection.Open(); using (OracleDataAdapter adapter = new OracleDataAdapter(command)) { DataTable dataTable = new DataTable(); adapter.Fill(dataTable); // 先清空集合 checkedComboBoxEdit_lotlist.Properties.Items.Clear(); // 添加数据项 foreach (DataRow row in dataTable.Rows) { string lotId = row["lotid"].ToString(); // 如 BP123456 checkedComboBoxEdit_lotlist.Properties.Items.Add(lotId); } // 在数据填充后设置多选模式 checkedComboBoxEdit_lotlist.Properties.AllowMultiSelect = true; } } } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值