数据库表定义
CREATE TABLE [ TestRDA ] ( [ AutoID ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL , [ AFlag ] [ varchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NOT NULL , [ AName ] [ varchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NULL , CONSTRAINT [ PK_TestRDA ] PRIMARY KEY CLUSTERED ( [ AutoID ] , [ AFlag ] ) ON [ PRIMARY ] ) ON [ PRIMARY ] GO
【注意】 AFlag主要用来标识数据是Server端修改的还是Mobile端修改的。
目前数据库的数据如下:
AutoID AFlag AName ==================================== 1 M 王伟 1 S Deboy 2 M 王伟 2 S Wang 3 M 王伟 3 S Randy 4 M 王伟 4 S Xia 5 M 王伟 6 M 王伟 7 M 王伟 ====================================
现象1: 当我编写一个Adapter类用来处理SQLCE上数据的批量更新和删除的时候,在编写UpdateCommand之时 如果写成
sqlUpdateCommand1.Parameters.Add( new SqlCeParameter( " @AFlag " , System.Data.SqlDbType.VarChar, 50 , " AFlag " ));
则报错:
未处理的“System.ArgumentOutOfRangeException”类型的异常出现在 System.Data.SqlServerCe.dll 中。 其他信息: ArgumentOutOfRangeException
如果写成:
sqlUpdateCommand1.Parameters.Add( new SqlCeParameter( " @AFlag " , System.Data.SqlDbType.NVarChar, 50 , " AFlag " ));
则问题解决,至于为什么,我不知道
现象2: 针对目前的数据,如果Mobile上在Pull的时候限制条件 AutoID<4,那么将会取下来如下数据:
1 M 王伟 1 S Deboy 2 M 王伟 2 S Wang 3 M 王伟 3 S Randy
此时,在Mobile上插入数据( M Test1) 则数据在数据库中表示为:
4 M Test1
那么当使用Push同步到数据的时候,将会出现如下错误
The table cannot be opened.[,,,Table Name,,]
原因:服务器上的主键已经存在,而且Mobile端并没有取此数据进行更改,而是完全新建的,将会产生冲突。
现象3: 如果在服务器端修改了数据: 1 M 王伟(=>Test) 然后在Mobile上修改了这条数据: 1 M 王伟(=>Mobile) 当最后使用RDA的Push方法的时候,此数据在服务器上的结果将是 1 M Mobile 因此数据的修改冲突,没有优先级排序,只有修改时间前后的判定
现象4: 当Mobile端使用RDA的Push方法的时候,Mobile端将只提交在上一次Pull或者Push之后更改的部分。