2011-02-22 49 views
1

我有一个约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。)

+0

当你限制回来说,5左右行#会发生什么。根据我在google上发现的,结果集大于缓冲区。增加缓冲区将允许更大的结果集。就代码而言,应该没有会影响缓冲区的“清理”。 –

+0

这很奇怪,我将行数限制为1.“whereValue”将其限制为仅一行。当我遍历代码时,它每次只返回一行... – Vaccano

+1

您使用TableDirect的任何原因?您是否尝试过获取数据,然后填充DataTable或DataSet?你在某处放置你的命令吗?我有强烈的感觉,如果你使用了TextType的CommandType,发出查询然后使用ExecuteReader,这个问题就会消失。您可以使用DbAdapter来填充DataTable/DataSet。 –

回答

3

你处置的地方你的命令?

任何实现IDisposable(具有Dispose()方法)都应该处理。这是一般规则。既然你为每一行调用这个方法,你应该处理你的命令。

+0

再次感谢!事实证明,我有很多“一次性”的物体悬挂在身边。我把它们解决了几个问题就消失了。 – Vaccano

+0

@Vaccano,太棒了!感谢您的更新。 –

相关问题