Использовавшийся в предыдущем примере режим называют соединенным. Программа соединяется с базой данных, выполняет все необходимые действия, а затем отсоединяется. При этом перемещаться по данным базы можно только в одном направлении. Это соответствует однонаправленному курсору/набору записей в классической технологии доступа к данным ADO. При использовании соединенного режима следует открывать и закрывать соединение явно.
Держать соединение постоянно открытым — не лучший способ работы, если вы хотите минимизировать потребление ресурсов (соединение само по себе недешево) для обеспечения масштабируемости. Тем не менее, как мы увидим позже, именно использование SqlDa-taReader может, в зависимости от ваших потребностей, оказаться правильным подходом.
Далее будет показано, что SqlConnection используется вместе с DataSet (Набор данных) и SqlDataReader для установления соединения с базой данных так же, как это сделано выше с помощью SqlCommand. Объект SqlConnection, кроме того, управляет свойствами базы данных, такими, как транзакции и уровни изоляции. Основная (root) транзакция начинается вызовом метода BeginTransaction класса SqlConnection". Аналогичная строка соединения с SQL Server с использованием объекта класса OleDbConnection будет такой:
"Provider=SQLOLEDB.1;server=localhost;uid=sa;pwd=;
database=Northwind";
В приведенной строке следует изменить на корректные имя сервера, идентификатор и пароль пользователя.
Как уже было сказано, SqlCommand применяется для выполнения команд при использовании и DataSet (Набор данных) и SqlDataReader, только действует немного по-разному. Это станет более понятным после рассмотрения класса SqlDataAdapter.
Свойство CommandType определяет тип команды, хранимой в SqlCommand. Для источника данных Sql это может быть Text (Текст) (принятое по умолчанию значение) или StoredProcedure (Хранимая процедура). CommandText также можно определить как свойство. Вскоре мы научимся использовать параметры при работе с командами, которые передаются базе данных.
Экземпляр класса SqlDataReader возвращается посредством метода Ехе-cuteReader экземпляра класса SqlCommand. Если программа должна быть независима от используемого источника данных, вместо указанного метода следует использовать интерфейс IDataReader. При этом можно вызывать методы интерфейса, а не самого экземпляра класса.
IDataReader *idr = command->ExecuteReader() ;
Этот же прием можно использовать и для других классов источника данных, где реализованы интерфейсы, которые поддерживаются несколькими источниками данных. Пока экземпляр класса SqlDataReader не будет закрыт, никакие действия над объектом SqlCommand, кроме его закрытия, недоступны.