Delphi出错:数据集未处于编辑或插入模式

时间:2018-01-18 05:31:36

标签: delphi

现在我正在努力解决由Delphi的数据集模式引起的错误(使用ADODataset),

以下为添加按钮机制的详细信息:

item.7[0]

我已经在保存按钮上将adodataset设置为追加模式:

IDMain: =self.DBTextIDUser.Caption+'-'+self.DBEditWorkingDate.Text;
datamodule1.ADODataSetWorkingDetails.Append;

with datamodule1.ADODataSetWorkingDetails do

begin

  dbgridworkinghours.Fields[0].AsString := IDMain;
  dbgridworkinghours.Fields[7].AsString := self.DBTextIDUser.Caption;
  dbgridworkinghours.Fields[8].AsString := self.DBTextName.Caption;
  dbgridworkinghours.Fields[9].AsString := self.DBEditWorkingDate.Text;
  dbgridworkinghours.Fields[11].AsString := self.DBTextPeriod.caption;
  dbgridworkinghours.Fields[10].AsString := self.DBTextToday.Caption;

end;

单击“保存”按钮时,出现错误:

  

adodataset未处于编辑/插入模式

我已经在另一种形式使用了这种机制,它可以正常工作

注意:我已经尝试将adodataset模式设置为insert,但仍然面临同样的错误

1 个答案:

答案 0 :(得分:2)

@kobik说的话。

您的问题很可能是由您未在q中告诉我们的事情引起的。 我认为重要的是你要找到如何调试这种东西 你自己,所以即使你不了解原因,你至少可以孤立 当你在这里寻求帮助时,它会提供更好的信息。所以我要去 概述了如何做到这一点。

  • 在“项目选项”中,选中“使用调试DCU”框

  • 为ADODataSetWorkingDetails设置两个事件处理程序 AfterPostAfterScroll个事件,在这两个事件中都添加了一些“无所事事”的代码 (停止IDE删除它们)。在第一行放置一个调试器断点 在AfterScroll处理程序内,但不是AfterScroll处理程序。

  • 编译并运行您的程序。

  • 您应该在致电Append之后但在点击之前找到 保存按钮,调试器在AfterPost断点处停止。

  • 当它发生时, 转到View | Debug windows | Call stack。这将显示一个列表 程序行,顶部的那一行是最接近断点的那一行 跳闸。这很可能在VCL的运行时代码内部(这就是原因) 我说检查“使用调试DCU”。将列表向下滚动到底部,然后 最终你应该找到一条线,这就是为什么 Post被调用的原因。

  • 如果您不明白调用AfterPost事件的原因,请设置断点 在Append行,然后再次运行该程序。当这个断点跳闸时, 在你的AfterScroll事件中添加另一个断点,恢复该程序 按F9查看AfterScroll断点是否被击中。如果 它是,再次查看Call stack,这应该显示为什么它被称为 - 如果不明显,则将Call stack窗口的内容添加到q。 如果原因 明显,则更改您的代码以避免它。

我继续讨论AfterScroll事件的原因是不明显的 是当你的代码导致数据集滚动时,任何挂起的更改(因为 dtaset位于dsInsert或dsEdit状态将导致更改发布 然后,如果您尝试拨打Post,则会收到您引用的错误 数据集再次。调用Append最初将数据集设置为dsInsert状态,顺便说一句。

看看您是否至少可以确定导致数据集发布的原因 它应该是,并在评论你的q或这个答案时让我们知道。

顺便说一下,我强烈建议您不要在代码中使用with构造。虽然它可能会为你节省一些打字,但从长远来看,它可能会使错误发生的可能性更大,而且更难找到。

更新 TDataSet及其后代的State属性属于TDataSetState类型(请参阅 db.pas单元)。通常,对于浏览数据和围绕数据集导航, 数据集处于dsBrowse状态。如果您致电EditAppend(或Insert),则为数据集 暂时分别置于dsEdit或dsInsert状态。 DB.Pas中的各种例程 在执行某些操作之前检查数据集状态,如果是,则引发异常 DataSet未处于正常运行状态。非常非常可能 是这些检查中的一个给你例外。

我最初的预感是你的错误正在发生,因为发生了什么事情 导致Post被调用,因为如果Post成功,它会将数据集重新放入 dsBrowse州,所以当点击“保存”按钮调用Post时,数据集已经存在 在dsBrowse州。当然,您可以在DB.Pas中的TDataSet.Post中放置一个断点 检查数据集在调用时实际处于哪个状态。

您的例外原因还有两个主要可能性,即 要么调用TDataSet.Cancel,要么调用一般的Abort方法。去弄清楚 这些,在TDataSet.Cancel(在DB.Pas中)和第一行的第一行放置断点 Abort(在SysUtils.Pas中)。如果这些断点中的任何一个在您呼叫之间跳闸 AppendPost,然后您可以使用“调用堆栈”视图进行尝试 为什么执行到达那里。