我有一个约150行的表格。这些是在表中的数据类型:是否需要清理SQL CE ExecuteResultSet?
- INT(PK)
- 为nvarchar(52)
- TINYINT
- 日期时间
- 唯一标识符
- 为nvarchar(300)
- 位
- 位
- 位
- 位
我从Web服务下载数据并插入数据库。当我这样做,它工作正常。
我后来在执行我的程序时再次调用Web服务。由于我可能已经更新了第一次下载的一些数据,因此我检查数据库以查看该行已更改。如果它已经离开了它,如果不是的话,我会更新它。我认为这是检查是否存在导致我的问题。当我这样做时,我得到这个错误:
"SQL Server Compact has exceeded the buffer size. The default size can be increased on initialization by modifying the ssce: max buffer size property. [ The default size = 655360 ]"
注意:这不会立即发生在第二次。 (这意味着我走了一些行,他们更新得很好。)
我能想到的唯一的事情是我的结果集没有被清除掉。 (虽然我已经使用了相同的代码没有问题访问数据库。)
这里是我的代码:
public static SqlCeResultSet SetupTable(string tableName, string indexName,
bool allowUpdates, params object[] whereValues)
{
// The command used to affect the data
var command = new SqlCeCommand
{
CommandType = CommandType.TableDirect,
Connection = _connection,
// Set the table that we are going to be working with.
CommandText = tableName,
// Indicate what index we are going to be using.
IndexName = indexName
};
if ((whereValues != null) && (whereValues.Length > 0))
command.SetRange(DbRangeOptions.Match, whereValues, null);
// Get the table ready to work with.
if (allowUpdates)
return command.ExecuteResultSet(
ResultSetOptions.Updatable | ResultSetOptions.Scrollable);
else
return command.ExecuteResultSet(ResultSetOptions.Scrollable);
}
调用看起来是这样的:
SetupTable("tblMyTable", "IndexName", true, whereValue);
怪异的事情如果我不使用SetRange,它可以正常工作。在我看来,如果使用SetRange,它应该使用更少的缓冲区空间(并不像它看起来那样)。
当它与此错误崩溃后,查询分析器中的调用也将提供相同的消息。我可以调整我的缓冲区大小,但是我相信它会花费更长的时间才能填满(特别是因为我传入的“where”值将范围设置为单行)。
有一点需要注意的是,我为表中的每一行调用上面的代码。 (这就是为什么我问我是否应该清理我的结果。)虽然我在表格中为每一行调用它,但是在创建新表格之前,前一个超出了范围。
任何帮助将是伟大的!
(注:如果你想看到完整的代码,SetupTable东西,我把全班here。)
当你限制回来说,5左右行#会发生什么。根据我在google上发现的,结果集大于缓冲区。增加缓冲区将允许更大的结果集。就代码而言,应该没有会影响缓冲区的“清理”。 –
这很奇怪,我将行数限制为1.“whereValue”将其限制为仅一行。当我遍历代码时,它每次只返回一行... – Vaccano
您使用TableDirect的任何原因?您是否尝试过获取数据,然后填充DataTable或DataSet?你在某处放置你的命令吗?我有强烈的感觉,如果你使用了TextType的CommandType,发出查询然后使用ExecuteReader,这个问题就会消失。您可以使用DbAdapter来填充DataTable/DataSet。 –