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
我试图相对频繁地更新数据库中的一行,大约每秒一次,但是 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