【问题标题】:Error at Delphi : Dataset not in edit or insert modeDelphi 出错:数据集未处于编辑或插入模式
【发布时间】:2018-06-27 02:53:51
【问题描述】:

现在我正在努力解决由 Delphi 的数据集模式(使用 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 设置为追加模式:

datamodule1.ADODataSetWorkingDetails.post;

当我点击保存按钮时,出现如下错误:

adodataset 未处于编辑/插入模式

我已经在其他形式中使用过这种机制并且它有效

注意:我已经尝试将 adodataset 模式设置为插入,但仍然遇到同样的错误

【问题讨论】:

  • 网格是否连接到数据集?更重要的是为什么将值分配给网格而不是数据集?
  • 查看adodataset的其他事件。
  • 您好,帖子位于保存按钮:datamodule1.ADODataSetWorkingDetails.post。我之前的意思是,附加模式已经在添加按钮处设置。对于 Post,我已经将它放在保存按钮 (datamodule1.ADODataSetWorkingDetails.post)

标签: delphi


【解决方案1】:

@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,然后你可以使用调用堆栈视图来尝试计算 找出执行到那里的原因。

【讨论】:

  • 我不确定我是否理解您关于分配给数据集的事件的结论。我在用户代码中看不到Post,除了他提到的:I already set the adodataset to append mode at the save button: datamodule1.ADODataSetWorkingDetails.post;。那是什么意思?我没有任何线索。目前尚不清楚它发生在哪里。 Append 之后会发生滚动,所以我也不确定您提到的 AfterScroll 事件(或者我可能完全误解了您的回答)。我投票结束了这个问题。
  • @kobik:我无意暗示这是 OP 设置的事件导致了问题,我不知道 OP 所说的“我已经设置了.. . 保存按钮。我猜新记录会在 OP 没有意识到的情况下自动发布 - 他提到“另一种形式” - 也许有什么事情发生了。无论如何,追求我们的定期投稿人 David H 的主题是提问者应该学会调试自己的问题,我只是希望能够为 OP 指出能够做到这一点的方向。
  • 嗨,附加模式,我已经在我已经创建的添加按钮上设置了它。对于帖子,将其设置在我已经创建的保存按钮上
  • @TimmyBudiman:好的,但你没有说你在尝试我在回答中解释的内容是否成功。我添加了一个更新部分,它解释了您可以使用调试器断点调查的其他两个可能原因。
  • @MartynA 抱歉回复晚了,我已经根据您的解释尝试过,问题已解决。非常感谢
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2014-01-13
  • 2023-04-10
相关资源
最近更新 更多