现在我正在努力解决由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,但仍然面临同样的错误
答案 0 :(得分:2)
@kobik说的话。
您的问题很可能是由您未在q中告诉我们的事情引起的。 我认为重要的是你要找到如何调试这种东西 你自己,所以即使你不了解原因,你至少可以孤立 当你在这里寻求帮助时,它会提供更好的信息。所以我要去 概述了如何做到这一点。
在“项目选项”中,选中“使用调试DCU”框
为ADODataSetWorkingDetails设置两个事件处理程序
AfterPost
和AfterScroll
个事件,在这两个事件中都添加了一些“无所事事”的代码
(停止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
状态。如果您致电Edit
或Append
(或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中)。如果这些断点中的任何一个在您呼叫之间跳闸
Append
和Post
,然后您可以使用“调用堆栈”视图进行尝试
为什么执行到达那里。