SQL 服务器 CE 4.0 在调用 Fill 后没有立即更新

SQL Server CE 4.0 not updating immediately after call to Fill

我试图相对频繁地更新数据库中的一行,大约每秒一次,但是 SQL Server CE 似乎忽略了大部分更新,直到感觉像是真正提交了其中一个更新.

如果我调试代码并坐在 Fill(ds); 行上,然后跨过它,然后检查数据库,它每次都会更新。

好像因为我经常更新,所以它会任意忽略一些更新,最终在处理 5-10 秒后才提交一个。

我想知道 SQL Server CE 4.0 是否有什么会导致这种情况,或者是否有一些 属性 适配器需要设置才能即时推送更新?

通常只有一列被更新,它本质上是一个计数器,所以对于每个++,当前行都会有一个更新。在 实际上 更新该列之前通常需要 5 次以上的调用,但是,如果我将每次调用之间的时间增加到 3-5 秒,它将提交对该列的所有更改。

编辑:

代码真的只是:

bool isPass = false;
int iCount = 0;

if (EnsureConnectionOpen()) {
    while (!isPass && (iCount++ < 3)) {
        try {
            cmd.Prepare();
            CreateDataAdapter(cmd).Fill(ds);
            isPass = true;
        }
    }
}

下面有一些 catch 逻辑,但我不会在这里生成任何异常。

CreateAdapter 吐出 cmd 作为 SqlCeCommand,其中包含参数。

SQL是标准更新语句(即cmd.CommandText):

UPDATE someTable 
SET column1 = @param1, 
    column2 = @param2. . .

交易代码:

SqlCeTransaction trans = (cmd.Connection as SqlCeConnection).BeginTransaction();
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
trans.Commit(CommitMode.Immediate);

我正在使用 as SqlCeConnection 转换,因为 cmd 对象最初作为 DbCommand 进入函数。

SQL CE只定时刷新到磁盘,可以通过连接字符串改变:

"Specified the interval time (in seconds) before all committed transactions are flushed to disk. If not specified, the default value is 10."

不要在您的连接字符串中包含该设置,您将面临丢失数据的风险:http://erikej.blogspot.dk/2016/02/sql-server-compact-40-sp1-hotfix.html

您可以通过包装在 CommitMode 为 Immediate 的 SqlCeTransaction 中强制刷新。

http://erikej.blogspot.dk/2013/05/sql-server-compact-code-snippet-of-week_21.html