我在 SQL Server 和本地 SQL Server 紧凑型数据库之间移动数据。我正在使用标准 DataAdapter.Fill 等使用单个表填充数据集。然后将该数据集传递给另一个尝试更新本地 SQL Compact DB 的函数。
所以基本上我想从数据库(SQL Server)上提取一个带有单个数据表(现在)的数据集,然后将它扔到另一个数据库(SQL Compact)中。
(是的,我知道有工具可以做到这一点,并且同步框架还有其他原因导致这种方法)
为了检测我正在使用数据版本(我自己的滚动)和 ID 的更改。因此,如果 ID 大于我们拥有的最高 ID,则将该行标记为已添加,否则如果该行的数据版本较高,则将该行标记为已更改。
if (Convert.ToInt32(row["SettingID"]) > id)
{
row.AcceptChanges();
row.SetAdded();
}
else if(Convert.ToInt32(row["DataVersion"]) > dv)
{
row.AcceptChanges();
row.SetModified();
}
删除的处理方式略有不同,这在这里并不重要。
然后我制作了一个 SqlCeAdapter 来尝试将记录插入/更新到 CE 数据库中。
using (SqlCeDataAdapter ad = new SqlCeDataAdapter("select * from " + tableName, Connection))
{
using (SqlCeCommandBuilder cb = new SqlCeCommandBuilder(ad))
{
cb.ConflictOption = ConflictOption.OverwriteChanges;
ad.UpdateCommand = (SqlCeCommand)cb.GetUpdateCommand();
ad.InsertCommand = (SqlCeCommand)cb.GetInsertCommand();
ad.FillSchema(ds, SchemaType.Source); //Tried both types and not doing this.
ad.RowUpdating += ad_RowUpdating;
ad.RowUpdated += ad_RowUpdated;
int result = ad.Update(ds, tableName);
}
}
对于插入,这很好用——它们都通过了。
更新不起作用。
如果我检查正在传入的数据表的行(即在上面的 using 语句之后),它们的状态为 changed 这是正确的。Update 方法返回要更新的正确行数,但它们并没有改变(它撒谎!)。也不例外。
我订阅了 RowUpdating 和 RowUpdated 事件,并且 RowUpdating 方法会为每一行触发。当我查看 SqlCeRowUpdatedEventArgs 时,每一行的状态为 SkipCurrentRow 并且命令对象为空。RowUpdated 事件永远不会触发。
为什么 Modified 的状态丢失并且 SkipCurrentRow 正在使用?
如果我修改它并创建一个目标数据集并使用来自源的行更新它,那么两个事件都会触发并且更新确实会发生。再次不知道有什么区别。我尝试比较数据集和数据表的属性,它们看起来相同。
我认为这应该很简单,但它是额头->桌面界面情况之一。
有任何想法吗 ?