Типы курсоров
Курсоры Microsoft SQL Server Compact 4.0 похожи на курсоры, используемые в SQL Server. Различия описаны в этом разделе. Полное описание курсоров баз данных см. в разделе SQL Server электронной документации.
SQL Server Compact 4.0 поддерживает следующие типы курсоров:
Базовая таблица
Статические
Последовательные
Последовательные «только для чтения»
Управляемые набором ключей
Курсоры базовой таблицы
Курсоры базовой таблицы — это курсоры самого нижнего уровня. Эти курсоры работают непосредственно с ядром хранилища данных и являются самими быстрыми. Курсоры базовой таблицы можно прокручивать вперед или назад с минимальными затратами производительности, а также обновлять.
Кроме того, курсор можно открыть непосредственно в индексе. Поддержка индексов позволяет упорядочивать строки в таблице, разрешать поиск по конкретным значениям и ограничивать строки на основании диапазона значений в индексе.
Курсоры базовой таблицы имеют динамическое членство. Это означает, что два курсора, открытые в одной таблице, могут сразу же видеть все вставки, удаления и изменения данных при условии, что оба они находятся в одной области транзакции. Поскольку курсоры базовой таблицы можно обновлять, клиент может воспользоваться подобным курсором для изменения нижележащих данных.
Курсоры базовой таблицы не могут представлять собой результат запроса. Такими курсорами не возвращаются результаты запросов, например SELECT * FROM tablename. Вместо этого используется один из поддерживаемых курсоров результатов запроса.
В следующем примере показано, как получить курсор базовой таблицы при помощи ADO .NET:
//Base Table Cursor
cmd.CommandText = "tablename";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
В следующем примере показано, как получить курсор индекса посредством ADO .NET:
cmd.CommandText = "tablename";
cmd.IndexName = "indexname";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
Статические курсоры
Статический курсор, который в ранних версиях SQL Server Compact 4.0 назывался прокручиваемым курсором запросов, создает и сохраняет абсолютную копию результирующего набора. Исключением из этого являются лишь данные с типом long, которые извлекаются после их явного запроса. Результирующий набор заполняется только по мере необходимости. В SQL Server это выглядит иначе: результирующий набор заполняется при создании курсора. Статические курсоры поддерживают прокрутку назад и вперед, но не обновления. Статические курсоры не видят внешних изменений нечувствительных данных. Результаты запроса остаются в кэше все время существования курсора. Хотя статические курсоры имеют больше функций, чем последовательные, они медленнее и требуют больше памяти. Рекомендуется использовать статические курсоры, только когда необходима прокрутка, но курсор набора ключей неприменим.
Ниже приведен пример получения статического курсора при помощи ADO.NET:
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Insensitive);
Последовательные курсоры
Последовательный курсор — это самый быстрый обновляемый курсор, который, однако, не поддерживает прокрутку. Он поддерживает лишь последовательное получение строк от начала до конца курсора. Строки не извлекаются из базы данных до их получения. Изменения всех инструкций INSERT, UPDATE и DELETE, сделанные текущим пользователем или зафиксированные другими пользователями и затрагивающие строки в результирующем наборе, становятся видимыми по мере их получения от курсора. Поскольку курсор нельзя прокручивать назад, изменения, внесенные в строки базы данных после получения строки, не видимы при использовании курсора.
Последовательные курсоры и последовательные курсоры «только для чтения» — это самые быстрые из основанных на запросах курсоров. Их следует применять в сценариях, где наиболее важным является скорость и объем памяти.
В следующем примере показано, как получить последовательный курсор посредством ADO .NET:
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable);
Последовательные курсоры «только для чтения»
Последовательный курсоры «только для чтения» которые в предыдущих версиях SQL Server Compact 4.0 назывались последовательными курсорами. Это самые быстрые курсоры, которые, однако, нельзя обновлять.
В следующем примере показано, как получить последовательный курсор «только для чтения» при помощи ADO .NET:
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.None);
Примечание. Курсоры «только для чтения» нельзя создавать для запроса, который возвращает столбцы, доступные только для чтения, поскольку все курсоры SQL Server Compact 4.0 обновляются внутренними механизмами. SQL Server Compact 4.0 не может обновлять столбцы только с возможностью чтения, возвращаемые в SqlCeResultSet. Соответственно, произойдет сбой с ошибкой «Не удается создать обновляемый курсор для запроса, поскольку отсутствует обновляемый столбец».
Курсоры, управляемые набором ключей
В SQL Server Compact 4.0 курсор, управляемый набором ключей, является прокручиваемым и обновляемым. Курсоры, управляемые набором ключей, контролируются набором физических идентификаторов, известным как набор ключей. Ключевой набор основывается на всех строках, которые соответствовали инструкции SELECT при открытии курсора. Ключевой набор встраивается во временную таблицу при открытии курсора. Его членство определяется при выполнении запроса.
Курсоры, управляемые набором ключей, в SQL Server Compact 4.0 несколько отличаются от аналогичных в SQL Server. В SQL Server курсор, управляемый набором ключей, использует в качестве ключей набора уникальные идентификаторы. В SQL Server Compact 4.0 ключи служат закладками, которые обозначают места логического хранения значений в таблице. Они не являются уникальными идентификаторами.
Хотя курсор, управляемый набором ключей, является чувствительным к определенным изменениям, его чувствительность ниже, чем у других курсоров. Например, вставка вне курсора видна не будет, тогда как вставки в его пределах в итоге окажутся видны. В этом случае рекомендуется закрывать и повторно открывать курсор или использовать один из последовательных курсоров.
Поскольку SQL Server Compact 4.0 использует закладки для определения набора ключей, все изменения данных в строках, включенных в набор ключей, становятся видны при использовании курсора. Это справедливо как для изменений, сделанных внутри курсоров, и для изменений вне их.
Любые удаления в курсоре набора ключей, как внутри него, так и за его пределами, приводят к тому, что при попытке получения строка будет считаться удаленной.
В следующем примере показано, как получить курсор, управляемый набором ключей, при помощи ADO .NET:
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
Работа с объединениями
Если запрос, используемый для открытия курсора, управляемого набором ключей, содержит объединенные столбцы, их нельзя обновлять. Пользователь может вставить новые значения в эти столбцы, однако обновления не поддерживаются.
Если набор ключей используется для заполнения элемента управления, обновляемого пользователем, например объекта DataGrid, возможно, пользователи предпримут попытки обновить значения в элементе управления, однако такое обновление выполнить не удастся. Разрабатывая приложение, где DataGrid используется для отображения данных в объединенных столбцах, убедитесь, что объединенные столбцы в DataGrid доступны только для чтения.