M
mxchao
Unregistered / Unconfirmed
GUEST, unregistred user!
1、前提
delphi 三层,dsp+ADO。dsp.updatemode =upWhereAll,直接使用dsp.applyupdates(0)进行数据更新。
2、表创建语句
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Table1]
GO
CREATE TABLE [dbo].[Table1] (
[testid] [uniqueidentifier] NOT NULL ,
[svalue] [numeric](19, 8) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table1] WITH NOCHECK ADD
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
[testid]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table1] ADD
CONSTRAINT [DF_Table1_testid] DEFAULT (newid()) FOR [testid]
GO
3、特定数据 numeric类型 ,数据值 7.97115456。
随便新增一条数据,将svalue的值赋值为7.97115456
4、在delphi随便做一个工程,增加bdgrid,增加applyupdate的代码
5、运行,修改这条记录,进行提交,必然出错!提示record changed by other user
6、跟踪sql语句,将sql语句放到查询分析器执行,正确!
7、跟踪delphi代码,发现在执行sql语句后,并没有正确返回。
procedure TSQLResolver.DoExecSQL(SQL: TStringList;
Params: TParams);
var
RowsAffected: Integer;
begin
RowsAffected := IProviderSupport(Provider.DataSet).PSExecuteStatement(SQL.Text, Params);
if not (poAllowMultiRecordUpdates in Provider.Options) and (RowsAffected > 1) then
DatabaseError(STooManyRecordsModified);
if RowsAffected < 1 then
//××××在此返回值是0,正确应该是1
DatabaseError(SRecordChanged);
end;
8.继续跟踪,跟到Ado里边,到了
function TADOCommand.Execute(var RecordsAffected: Integer;
const Parameters: OleVariant): _Recordset;
var
VarRecsAffected: OleVariant;
begin
SetConnectionFlag(cfExecute, True);
try
Initialize;
Result := CommandObject.Execute(VarRecsAffected, Parameters,
CommandObject.CommandType + ExecuteOptionsToOrd(FExecuteOptions));
RecordsAffected := VarRecsAffected;////××××在此返回值是0,正确应该是1
finally
SetConnectionFlag(cfExecute, False);
end;
end;
9、总结
只要在极其特殊的数据下才出这个错误。一年一共遇到4条这种数据,客户不干了。
跟踪的sql语句可以在查询分析器执行,没有问题,执行正常。
直接用ado两层,不用三层,修改提交正常。
已经做了很多项目,只要一个项目出这种问题,郁闷!
郁闷,那位遇到过?给点意见!
delphi 三层,dsp+ADO。dsp.updatemode =upWhereAll,直接使用dsp.applyupdates(0)进行数据更新。
2、表创建语句
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Table1]
GO
CREATE TABLE [dbo].[Table1] (
[testid] [uniqueidentifier] NOT NULL ,
[svalue] [numeric](19, 8) NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table1] WITH NOCHECK ADD
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
[testid]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table1] ADD
CONSTRAINT [DF_Table1_testid] DEFAULT (newid()) FOR [testid]
GO
3、特定数据 numeric类型 ,数据值 7.97115456。
随便新增一条数据,将svalue的值赋值为7.97115456
4、在delphi随便做一个工程,增加bdgrid,增加applyupdate的代码
5、运行,修改这条记录,进行提交,必然出错!提示record changed by other user
6、跟踪sql语句,将sql语句放到查询分析器执行,正确!
7、跟踪delphi代码,发现在执行sql语句后,并没有正确返回。
procedure TSQLResolver.DoExecSQL(SQL: TStringList;
Params: TParams);
var
RowsAffected: Integer;
begin
RowsAffected := IProviderSupport(Provider.DataSet).PSExecuteStatement(SQL.Text, Params);
if not (poAllowMultiRecordUpdates in Provider.Options) and (RowsAffected > 1) then
DatabaseError(STooManyRecordsModified);
if RowsAffected < 1 then
//××××在此返回值是0,正确应该是1
DatabaseError(SRecordChanged);
end;
8.继续跟踪,跟到Ado里边,到了
function TADOCommand.Execute(var RecordsAffected: Integer;
const Parameters: OleVariant): _Recordset;
var
VarRecsAffected: OleVariant;
begin
SetConnectionFlag(cfExecute, True);
try
Initialize;
Result := CommandObject.Execute(VarRecsAffected, Parameters,
CommandObject.CommandType + ExecuteOptionsToOrd(FExecuteOptions));
RecordsAffected := VarRecsAffected;////××××在此返回值是0,正确应该是1
finally
SetConnectionFlag(cfExecute, False);
end;
end;
9、总结
只要在极其特殊的数据下才出这个错误。一年一共遇到4条这种数据,客户不干了。
跟踪的sql语句可以在查询分析器执行,没有问题,执行正常。
直接用ado两层,不用三层,修改提交正常。
已经做了很多项目,只要一个项目出这种问题,郁闷!
郁闷,那位遇到过?给点意见!