该死的 unable to find record. No key specified 高手指点下

bjcx994 2010-01-19 03:37:08
unable to find record. No key specified
数据库:SQL SERVER 主要更新字段类型为:decimal(10,2)
主键为自增列 [int] IDENTITY (1, 1) prmiarykey
DataSetPRovider: option.poincfieldprops:=true
updatemode:=upwherekeyonly
clientdataset :主键设置为:providerFlags= [pfInUpdate,pfInWhere,pfInKey]
其它:pfInUpdate
插入数据没有问题,但是修改保存就不行,在编译器中出现unable to find record. No key specified ,离开编译器无错误提示,但是数据未保存

高手都支下操,我最怕的这是这个错误了..........
delphi 7 + cds+ADO......
...全文
1134 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjcx994 2010-01-22
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 avan_lau 的回复:]
這段說明,以前收藏的,你可以參考一下
Delphi(Pascal) code2. Cursor Location
在MTS/COM+分布式
多层应用系统中,不管你是使用 MIDAS、RDS或其他的方法来处理数据,这些数据都会
由客户端的引擎 ( MIDAS,RDS 等)来负责处理。中间的 MTS/COM+组件在传递数据给客
户端之后就会自动被释放或被其他的客户端重复使用,因此ADO 本身的Cursor
Location 就没有什么作用了。所以建议各位在分布式多层应用系统中千万不要设定
Cursor Location为clUseServer。这样不但没有用,而且会减慢MTS/COM+组件存取数
据的速度。3. Cursor Type
由于在MTS/COM+应用系统中不像主从架构一样是持续地和数据库连接,因此客户
端浏览或处理的数据只是cache在客户端内存中的数据。所以在MTS/COM+中的MTS/COM+
组件在使用TADOQuery 或TADOTable 存取数据时,便不需要设定等级较高的Cursor
Type,这样不但没有作用,反而增加了 MTS/COM+组件的负担。而且客户端的引擎
( MIDAS 或RDS )都有自己维护cursor 的机制,因此在MTS/COM+中我们应该只使用最
经济、负担最小的 cursortype。因此建议你只需要使用 ctStatic 这种cursortype即可。4. Isolation Level
Isolation Level设定的原因也和前面说的一样,在客户端应用程序中处理的数据
只是 cache 在客户端的数据。在分布式多层应用系统中客户端的数据一定是和数据库
服务器没有直接连接的。程序员如果使用太严格的 Isolation Level 也没有多大的作
用,反而会增加系统使用的资源 (锁定机制 ),因此建议在 MTS/COM+组件中使用的ADO
数据集组件只使用 ilCursorStability或ilRea DCOMmitted即可。如果程序员真的很
在意数据的完整性,那么可以撰写较多的数据处理程序代码以及数据例外处理程序代
码。5. Keep Connection
在MTS/COM+分布式多层应用系统中, MTS/COM+在执行完工作之后就应该关闭数据
库和数据库的连接,并且被释放。因此 Keep Connection这个特性值可以设定为False,
以避免不必要的负担。6. Lock Type
当然,对于 Lock Type 来说, MTS/COM+组件使用的 ADO 数据集应该使用
ltOptimistic或ltBatchOptimistic,因为分布式多层应用系统中客户端的数据在被修
改时是和数据库没有直接连接的,因此使用ltPessimistic 没有作用,反而会在
MTS/COM+组件存取数据时使用了不必要的锁定资源。这会造成系统的执行效率降低,并
且增加数据库服务器的负担。7. MarshalOptions
如果使用MIDAS 做为MTS/COM+应用系统中传递数据的技术,那么由于客户端应用
程序或浏览器传递到 MTS/COM+组件中的数据已经只是经过修改的数据,因此可以设定
这个特性值为moMarshalModifiedOnly,以减少ADO 驱动程序不必要的工作。
[/Quote]谢谢
bjcx994 2010-01-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 avan_lau 的回复:]
不好意思,是我搞錯了。

DatasetProvider不能自动处理Join来的多个Table的提交。
ADO正好相反,可以自动处理Join来的多个表的提交。

所以應該是把resolveToDataset設為True,讓ado去處理。


[/Quote]

用ADO处理时要注意什么?
bjcx994 2010-01-21
  • 打赏
  • 举报
回复
对了,如果用ADO更新,有副面效果吗,要注意些什么问题?
刚加了60分,谢谢大家!
金卯刀 2010-01-21
  • 打赏
  • 举报
回复
這段說明,以前收藏的,你可以參考一下

2. Cursor Location
在MTS/COM+分布式
多层应用系统中,不管你是使用 MIDAS、RDS或其他的方法来处理数据,这些数据都会
由客户端的引擎 ( MIDAS,RDS 等)来负责处理。中间的 MTS/COM+组件在传递数据给客
户端之后就会自动被释放或被其他的客户端重复使用,因此ADO 本身的Cursor
Location 就没有什么作用了。所以建议各位在分布式多层应用系统中千万不要设定
Cursor Location为clUseServer。这样不但没有用,而且会减慢MTS/COM+组件存取数
据的速度。

3. Cursor Type
由于在MTS/COM+应用系统中不像主从架构一样是持续地和数据库连接,因此客户
端浏览或处理的数据只是cache在客户端内存中的数据。所以在MTS/COM+中的MTS/COM+
组件在使用TADOQuery 或TADOTable 存取数据时,便不需要设定等级较高的Cursor
Type,这样不但没有作用,反而增加了 MTS/COM+组件的负担。而且客户端的引擎
( MIDAS 或RDS )都有自己维护cursor 的机制,因此在MTS/COM+中我们应该只使用最
经济、负担最小的 cursor type。因此建议你只需要使用 ctStatic 这种cursor type即可。

4. Isolation Level
Isolation Level设定的原因也和前面说的一样,在客户端应用程序中处理的数据
只是 cache 在客户端的数据。在分布式多层应用系统中客户端的数据一定是和数据库
服务器没有直接连接的。程序员如果使用太严格的 Isolation Level 也没有多大的作
用,反而会增加系统使用的资源 (锁定机制 ),因此建议在 MTS/COM+组件中使用的ADO
数据集组件只使用 ilCursorStability或ilRea DCOMmitted即可。如果程序员真的很
在意数据的完整性,那么可以撰写较多的数据处理程序代码以及数据例外处理程序代
码。

5. Keep Connection
在MTS/COM+分布式多层应用系统中, MTS/COM+在执行完工作之后就应该关闭数据
库和数据库的连接,并且被释放。因此 Keep Connection这个特性值可以设定为False,
以避免不必要的负担。

6. Lock Type
当然,对于 Lock Type 来说, MTS/COM+组件使用的 ADO 数据集应该使用
ltOptimistic或ltBatchOptimistic,因为分布式多层应用系统中客户端的数据在被修
改时是和数据库没有直接连接的,因此使用ltPessimistic 没有作用,反而会在
MTS/COM+组件存取数据时使用了不必要的锁定资源。这会造成系统的执行效率降低,并
且增加数据库服务器的负担。

7. MarshalOptions
如果使用MIDAS 做为MTS/COM+应用系统中传递数据的技术,那么由于客户端应用
程序或浏览器传递到 MTS/COM+组件中的数据已经只是经过修改的数据,因此可以设定
这个特性值为moMarshalModifiedOnly,以减少ADO 驱动程序不必要的工作。

金卯刀 2010-01-19
  • 打赏
  • 举报
回复
你ADOquery中的字段是靜態字段嗎?若是, 則需要設定pfinkey。
bjcx994 2010-01-19
  • 打赏
  • 举报
回复
我好像记得是可以加分的啊,找不到加分的地方是什么地方,想把总分加到100分,然后再测下有没有问题后结贴!·
bjcx994 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chao3428 的回复:]
没有设置主键,在adodataset里将SalaryReportItemResultID
设置pfinkey:=True
[/Quote]


谢谢,忘了true时是用 ADO来生成更新代码,而不是用clientdataset 生成更新代码!
chao3428 2010-01-19
  • 打赏
  • 举报
回复
没有设置主键,在adodataset里将SalaryReportItemResultID
设置pfinkey:=True
bjcx994 2010-01-19
  • 打赏
  • 举报
回复
设置为TRUE时,离开编译环境提示出错了
为false 时是提示保存成功,但是实际未保存
为true 时提示保存出错,进步了点,但是问题还是没能解决!
bjcx994 2010-01-19
  • 打赏
  • 举报
回复
设置为true 也是同样的错误
zrssweet 2010-01-19
  • 打赏
  • 举报
回复
up
bjcx994 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 avan_lau 的回复:]
不好意思,是我搞錯了。

DatasetProvider不能自动处理Join来的多个Table的提交。
ADO正好相反,可以自动处理Join来的多个表的提交。

所以應該是把resolveToDataset設為True,讓ado去處理。


[/Quote]
谢谢,一会儿测试了给结果,我现在把代码其它地方更改了,程序暂时不能运行。
金卯刀 2010-01-19
  • 打赏
  • 举报
回复
不好意思,是我搞錯了。

DatasetProvider不能自动处理Join来的多个Table的提交。
ADO正好相反,可以自动处理Join来的多个表的提交。

所以應該是把resolveToDataset設為True,讓ado去處理。

bjcx994 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 avan_lau 的回复:]
你的Datasetprovider.resolvetoDataset是否為true?
若為true,設為false

[/Quote]

是false的
金卯刀 2010-01-19
  • 打赏
  • 举报
回复
你的Datasetprovider.resolvetoDataset是否為true?
若為true,設為false
bjcx994 2010-01-19
  • 打赏
  • 举报
回复
如果记录不存在、我append时,就是可以的,但是edit时就出错!
locate是OK的,就是在 tablea..ApplyUpdates(0); 时出错
bjcx994 2010-01-19
  • 打赏
  • 举报
回复

CREATE TABLE [tablea] (
[SalaryReportItemResultID] [int] IDENTITY (1, 1) NOT NULL ,
[CustomerID] [int] NOT NULL CONSTRAINT [DF__CustomerS__Custo__47136FB6] DEFAULT (0),
[MonthID] [int] NOT NULL CONSTRAINT [DF__CustomerS__Month__480793EF] DEFAULT (0),
[StaffID] [int] NOT NULL CONSTRAINT [DF__CustomerS__Staff__48FBB828] DEFAULT (0),
[SalaryReportItemID] [int] NOT NULL CONSTRAINT [DF__CustomerS__Salar__49EFDC61] DEFAULT (0),
[SalaryReportItemResult] [decimal](10, 2) NOT NULL CONSTRAINT [DF__CustomerS__Salar__4AE4009A] DEFAULT (0),
[Notes] [varchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL CONSTRAINT [DF__CustomerS__Notes__4BD824D3] DEFAULT (''),
[upday] [datetime] NULL CONSTRAINT [DF__CustomerS__upday__1D1E64D5] DEFAULT (getdate()),
PRIMARY KEY CLUSTERED
(
[SalaryReportItemResultID]
) ON [PRIMARY]
) ON [PRIMARY]
GO









Select tablea.SalaryReportItemResultID
,tablea.CustomerID
,tablea.MonthID,
tablea.StaffID
,tablea.SalaryReportItemID
,SalaryItemName
,tablea.SalaryReportItemResult
,tablea.Notes
,itemcategories
From tablea
INNER JOIN tableb On tablea.SalaryReportItemID=tableb.SalaryItemID
and tablea.Customerid=tableb.customerid
and tableb.isactive=0
Where tablea.CustomerID = :nCustomerID And tablea.MonthID /100 = :nMonthID /100
Order By tablea.CustomerID,tablea.StaffID,tablea.SalaryReportItemID



我更新的为:SalaryReportItemResult


with clientdatasetA do
begin
if Locate('monthid;StaffID;salaryitemname',VarArrayOf([getMonth(SelectbeginYear ,SelectbeginMonth ),field.DataSet.FieldByName('StaffID').AsString,Field.FieldName]), []) then
begin

Edit ;
FieldByName('SalaryReportItemResult').AsFloat:=Field.Value ;
Post ;
end
end;



bjcx994 2010-01-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 cuixd2020 的回复:]
你是否修改了主键?
[/Quote]

没有修改主键,我只修改了类型为decimal(10,2)的这一列的值
金卯刀 2010-01-19
  • 打赏
  • 举报
回复
把你的table中所有的column貼出來瞧瞧,還是你的sql是怎么下。
acridin 2010-01-19
  • 打赏
  • 举报
回复
up
加载更多回复(1)

2,508

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧