无法为更新定位行。一些值可能已在最后一次读取后已更改。

cllxyuer 2003-12-26 09:44:45

无法为更新定位行。一些值可能已在最后一次读取后已更改。

ADO,原来用Access,完全没问题。

现在把数据库改成Sql Server.(还没有改动代码),第一次编辑时,没有问题,保存后再编辑,保存时就出现上面的问题。

我的是MDAC2.6(我有装过MS.NET,不知会不会是2.7),
Sql Server2K,
Delphi6,Sp2,Run time update 1+2

所有的表都有一个ID,自增的。没有默认值。
...全文
496 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
问题应该如chennai(脱西炽勒)所说的,但是,我先导出SQL查看看吧。

应该没问题吧?

/****** Object: Table [dbo].[Products] Script Date: 2003-12-26 12:44:00 ******/
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Products]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Products]
GO

/****** Object: Table [dbo].[Products] Script Date: 2003-12-26 12:44:01 ******/
CREATE TABLE [dbo].[Products] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[proNo] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,
[proCode] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[proNameCn] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[proNameEn] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[proManufacturerNo] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[proManufacturerProductNo] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[proKindNo] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL ,
[proPackageCn] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[proPackageEn] [varchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[proPrice] [money] NULL ,
[proLong] [float] NULL ,
[proWidth] [float] NULL ,
[proHeight] [float] NULL ,
[proPackingLong] [float] NULL ,
[proPackingWidth] [float] NULL ,
[proPackingHeight] [float] NULL ,
[proPackingVol] [float] NULL ,
[proPackingInnerBoxCount] [int] NULL ,
[proPackingOuterBoxQuantity] [int] NULL ,
[proGrossWeight] [float] NULL ,
[proNetWeight] [float] NULL ,
[proDescription] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[proRemark] [ntext] COLLATE Chinese_PRC_CI_AS NULL ,
[AddDate] [smalldatetime] NULL ,
[ModifyDate] [smalldatetime] NULL ,
[Operator] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[OperatorEx] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
chennai 2003-12-26
  • 打赏
  • 举报
回复
第一次你在内存中的记录与数据库中的记录是一样的,所以保存没问题;
第二次,你在内存中的记录已经与数据库中的记录不一样了。
证明你在第一次保存后,由于是默认值或自增值等又改变了数据库中的记录值,
导至内存中的记录与数据库中的记录不一样,所以再保存时便会发生这样的错误提示了。
hthunter 2003-12-26
  • 打赏
  • 举报
回复
不好意思,原来你上面已经检查过了,我刚才没看到,当我没说过,呵呵
hthunter 2003-12-26
  • 打赏
  • 举报
回复
to mxk19791116(幸运星) 和 楼主:
出现这种情况基本上就是因为没有设关键字的原因,不要急着从代码上找原因。
楼主,你检查了关键字和那些自增型id的设置没有?
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
TO:mxk19791116(幸运星)
主要不是这个问题,因为我其它的窗口也一样。而其它的窗口并没有上面的代码。
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
我用的是数据感知控件。
主要的控件是EhLib系列。

DBEditEh,DBGridEh...
mxk19791116 2003-12-26
  • 打赏
  • 举报
回复
哦,我想你说你第一次保存时不出错。是否第一次的时候都为空???

而第二次的时候就不是空了,而是0了,对不对???

你按我这个思路看一下,是不是这种错误呀
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
上面贴出来的只是Post代码。

//编辑
if (Sender as TBitBtn).Name='btn_Edit' then
begin
ds_DataSource.DataSet.Edit();
pg_Page.ActivePageIndex:=0;
cb_NameCN.SelectAll();
cb_NameCN.SetFocus();
end;

procedure TfrmProducts.aq_ADOQueryAfterEdit(DataSet: TDataSet);
begin
ed_OperatorEx.Field.Value:=g_sOperator;
ed_ModifyDate.Field.Value:=Now();
end;
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
其他表有关联是什么意思?
Drate 2003-12-26
  • 打赏
  • 举报
回复
一般来说,这个问题就是出在你的主键标识上
aiirii 2003-12-26
  • 打赏
  • 举报
回复
你的代碼, 怎麼不見
AdoXXX.Append 或 Edit???
然後, 如果 ed_XXXX裹面有數值, 那就不會給字段付值了???
Spring414 2003-12-26
  • 打赏
  • 举报
回复
你确定排除了默认值?其他表有关联乎?再查查哦。
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
这个问题在Delphibbs中也有提问。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2376172

代码在那边也有:
if (Sender as TBitBtn).Name='btn_Post' then
begin
//检查数据是否完整
if not CheckField() then exit;

if ed_Long.Text='' then ed_Long.Field.Value:=0;
if ed_Width.Text='' then ed_Width.Field.Value:=0;
if ed_Height.Text='' then ed_Height.Field.Value:=0;
if ed_PackingLong.Text='' then ed_PackingLong.Field.Value:=0;
if ed_PackingWidth.Text='' then ed_PackingWidth.Field.Value:=0;
if ed_PackingHeight.Text='' then ed_PackingHeight.Field.Value:=0;
if ed_PackingVol.Text='' then ed_PackingVol.Field.Value:=0;
if ed_PackingOuterBoxQuantity.Text='' then ed_PackingOuterBoxQuantity.Field.Value:=0;
if ed_PackingInnerBoxCount.Text='' then ed_PackingInnerBoxCount.Field.Value:=0;
if ed_GrossWeight.Text='' then ed_GrossWeight.Field.Value:=0;
if ed_NetWeight.Text='' then ed_NetWeight.Field.Value:=0;

//这里。
ds_DataSource.DataSet.Post();


end;
mxk19791116 2003-12-26
  • 打赏
  • 举报
回复
错误不在
Access和SQL Server的问题上。

转移视线吧
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
自增有标识,标识种子=1,增量是1。
有主键,但不是那个ID,主键是样品的编号。
mxk19791116 2003-12-26
  • 打赏
  • 举报
回复
你把出错语句放出来,大家看一下
hthunter 2003-12-26
  • 打赏
  • 举报
回复
你看看那个自增ID的“标识”、“标识种子”、“标识递增量”都设了没有,从一个数据库导数据到另一个数据库,这些东西和关键字等都很容易搞丢
Spring414 2003-12-26
  • 打赏
  • 举报
回复
是保存之后再编辑原来的行就会这个问题,如果关闭再打开后编辑是没有问题的。

!!!!!那你设置主键了没有?
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
会不会问题 出现在:我原来是用Access,现在用SQL Server?在这两个数据中转换,要注意什么?

难道我现重新设计所有的窗品和写所有的代码?那我不晕死?
cllxyuer 2003-12-26
  • 打赏
  • 举报
回复
我这里的问题是:第一次编辑,第一次Post没问题,再编辑再Post就出现了。



加载更多回复(15)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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