Нужно ли очищать SQL CE ExecuteResultSet? - PullRequest
1 голос
/ 23 февраля 2011

У меня есть таблица с 150 строками. Эти типы данных в таблице:

  • int (PK)
  • NVARCHAR (52)
  • TINYINT
  • Дата и время
  • UniqueIdentifier
  • NVARCHAR (300)
  • бит
  • немного
  • бит
  • бит

Я загружаю данные из веб-сервиса и вставляю в базу данных. Когда я это делаю, все работает нормально.

Я позже при исполнении моей программы снова вызываю веб-сервис. Поскольку я, возможно, обновил некоторые данные, которые я скачал в первый раз, я проверяю базу данных, чтобы увидеть, что строка изменилась. Если это так, я оставляю его, если нет, то я обновляю его. Я думаю, что это проверка, чтобы увидеть, если это там, вызывает у меня проблемы. Когда я делаю это, я получаю эту ошибку:

"SQL Server Compact превысил размер буфера. Размер по умолчанию можно увеличить при инициализации, изменив свойство буфера ssce: max 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 (не больше, чем кажется).

После сбоя с этой ошибкой вызовы в Query Analyzer также выдадут то же сообщение. Я мог бы увеличить размер буфера, но я уверен, что заполнение займет немного больше времени (особенно потому, что я передаю значение «где», которое устанавливает диапазон в одну строку).

Следует отметить, что я вызываю приведенный выше код для каждой строки в моей таблице. (Вот почему я спрашиваю, нужно ли мне убирать свои результаты.) Хотя я вызываю его для каждой строки в моей таблице, предыдущая выходит из области видимости, прежде чем я создаю новую.

Любая помощь будет отличной!

(Примечание: если вы хотите увидеть полный код для файла SetupTable, я поместил весь класс здесь .)

1 Ответ

3 голосов
/ 24 февраля 2011

Вы где-нибудь располагаете своей командой?

Все, что реализует IDisposable (имеет метод Dispose ()), должно быть удалено. Это общее правило. Поскольку вы вызываете этот метод для каждой строки, вы должны располагать своей командой.

...