Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否需要清理SQL CE ExecuteSultset?_C#_.net_Sql Server Ce - Fatal编程技术网

C# 是否需要清理SQL CE ExecuteSultset?

C# 是否需要清理SQL CE ExecuteSultset?,c#,.net,sql-server-ce,C#,.net,Sql Server Ce,我有一张大约有150行的桌子。以下是表中的数据类型: int(PK) nvarchar(52) 锡 日期时间 唯一标识符 nvarchar(300) 钻头 钻头 钻头 钻头 我从web服务下载数据并插入数据库。当我这样做的时候,效果很好 我稍后在执行程序时再次调用web服务。因为我可能已经更新了我第一次下载的一些数据,所以我检查数据库以查看行是否已更改。如果有,我就离开,如果没有,我就更新。我认为这是检查,看看是否有它是造成我的问题。当我这样做时,会出现以下错误: “SQL Server C

我有一张大约有150行的桌子。以下是表中的数据类型:

  • int(PK)
  • nvarchar(52)
  • 日期时间
  • 唯一标识符
  • nvarchar(300)
  • 钻头
  • 钻头
  • 钻头
  • 钻头
我从web服务下载数据并插入数据库。当我这样做的时候,效果很好

我稍后在执行程序时再次调用web服务。因为我可能已经更新了我第一次下载的一些数据,所以我检查数据库以查看行是否已更改。如果有,我就离开,如果没有,我就更新。我认为这是检查,看看是否有它是造成我的问题。当我这样做时,会出现以下错误:

“SQL Server Compact已超过缓冲区大小。可以在初始化时通过修改ssce:max buffer 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内容的完整代码,我把整个类都放在这里。)

您是否在某处处理您的命令


任何实现IDisposable(具有Dispose()方法)的内容都应该被释放。这是一般规则。由于您要为每一行调用此方法,因此应该处理您的命令。

当您将返回的行数限制为5左右时会发生什么情况。根据我在谷歌上的发现,结果集大于缓冲区。增加缓冲区将允许更大的结果集。就您的代码而言,不应该存在会影响缓冲区的“清理”。这很奇怪,我将行数限制为1。
whereValue
将其限制为仅一行。当我单步执行代码时,它每次只返回一行…您使用TableDirect的原因是什么?您是否尝试过只获取数据,然后填充数据表或数据集?你在某处指挥吗?我有一种强烈的感觉,如果使用CommandType文本,发出查询,然后使用ExecuteReader,这个问题就会消失。您可以使用DbAdapter来填充DataTable/DataSet。@Shiv Kumar-我的数据访问速度非常慢,所以我将其全部改为TableDirect,速度快得多。我不会在任何地方执行命令。我需要这样做吗?@Vaccano,任何实现IDisposable(具有Dispose()方法)的东西都应该被丢弃。这是一般规则。因为您要为每一行调用此方法,所以应该处理您的命令。你能把问题的第三段重新写清楚吗?。主键是否用于确定是否需要更新记录?这只是更新,还是在第一次之后有插入和删除?再次感谢!原来我身边有很多“一次性”物品。我解决了他们,解决了几个问题。