Asp выбор сетевой библиотеки клиента для ado


Получение библиотеки на стороне клиента в ASP.NET Core с LibMan Client-side library acquisition in ASP.NET Core with LibMan

Диспетчер библиотек (LibMan) — это облегченное средство получения библиотек на стороне клиента. Library Manager (LibMan) is a lightweight, client-side library acquisition tool. LibMan загружает популярные библиотеки и платформы из файловой системы или из сети доставки содержимого (CDN). LibMan downloads popular libraries and frameworks from the file system or from a content delivery network (CDN). Поддерживаются сети доставки содержимого CDNJS, jsDelivr и unpkg. The supported CDNs include CDNJS, jsDelivr, and unpkg. Выбранные файлы библиотеки извлекаются и размещаются в соответствующем месте в проекте ASP.NET Core. The selected library files are fetched and placed in the appropriate location within the ASP.NET Core project.

Варианты использования LibMan LibMan use cases

LibMan предоставляет следующие преимущества: LibMan offers the following benefits:

  • Загружаются только необходимые файлы библиотеки. Only the library files you need are downloaded.
  • Дополнительные средства, такие как Node.js, npm и WebPack, не обязательны для получения подмножества файлов в библиотеке. Additional tooling, such as Node.js, npm, and WebPack, isn’t necessary to acquire a subset of files in a library.
  • Файлы можно разместить в определенном расположении, не прибегая к задачам сборки или копированию файлов вручную. Files can be placed in a specific location without resorting to build tasks or manual file copying.

LibMan не является системой управления пакетами. LibMan isn’t a package management system. Если вы уже используете диспетчер пакетов, например npm или yarn, используйте его и дальше. If you’re already using a package manager, such as npm or yarn, continue doing so. LibMan не предназначен для замены этих средств. LibMan wasn’t developed to replace those tools.

Использование библиотеки ADO (Microsoft ActiveX Data Object)

Понятие о библиотеке ADO

Библиотека ADO (Microsoft ActiveX Data Object) служит для доступа к базам данных различных типов и предоставляет объектный программный интерфейс к интерфейсу OLE DB, который предлагается компанией Microsoft как альтернатива интерфейсу ODBC. Объектная модель ADO реализована на базе технологии COM (Component Object Model).

Библиотека ADO может быть использована в любых средах, которые в состоянии выступить в роли OLE-клиента, например, в MS Office (VBA), 1C:Предприятии, административных скриптах Windows (.vbs и .js) и т.д. Примеры кода в настоящей статье будут приводиться на языке VBScript для административных скриптов Windows. С помощью библиотеки ADO можно обратиться к огромному количеству типов баз данных, например, dBASE, Access, Excel, Oracle, Paradox, MS SQL Server, Sybase, текстовые файлы, FoxPro, Active Directory Service, Microsoft Jet, Interbase, Informix, PostgreSQL, MySQL и т.д., необходимо только наличие установленного соответствующего OLE-провайдера («драйвера» соответствующего типа базы данных, который устанавливается в систему как правило из дистрибутива этой же базы данных). Примеры кода в настоящей статье будут приводиться только для MS SQL Server, т.к. невозможно объять необъятное. Перечень свойств и методов ADO, приведённый в этой статье, не является исчерпывающим (в некоторых случаях и описание некоторых свойств и методов не является полным). Полное описание объектной модели библиотеки ADO вы можете получить в MSDN или в файле «ADO210.CHM», который входит в поставку MS Office. Однако материала данной статьи достаточно, чтобы начать работать с ADO.

Основными объектами библиотеки ADO являются объекты Connection, Command и Recordset.

Объект Connection

Объект Connection обеспечивает создание подключения к источнику данных и эквивалентен текущему сетевому соединению с сервером. Объект Connection предоставляет возможность настройки соединения перед его открытием, установки базы данных по умолчанию, установки и разрыва соединения с источником данных, задания настроек и выполнения команды с помощью метода Execute. Примечание: для выполнения команды можно использовать также метод Execute объекта Command, не прибегая к объекту Connection.

Объект Connection создаётся следующим образом:

Set objConn = CreateObject(«ADODB.Connection»)

После этого вы можете вызывать и использовать методы и свойства этого объекта для доступа к базам данных:

Описание
VersionСодержит строку, определяющую версию библиотеки. Только чтение.
ConnectionStringОпределяет параметры подключения к источнику данных. Чтение и запись. Это строка, содержащая несколько параметров, разделённых точкой с запятой. Свойство ConnectionString автоматически получает значение, заданное в качестве одноимённого аргумента метода Open. Свойство ConnectionString доступно для записи только для закрытого соединения. Многочисленные примеры различных строк подключения для различных типов баз данных вы можете найти в Интернете или в документации к соответствующим программным продуктам.
ConnectionTimeoutУстанавливает или возвращает число секунд ожидания подключения к базе данных. Значение по умолчанию — 15. Используйте это свойство, если возникают проблемы из-за плотного сетевого трафика или загруженности сервера. Если время, указанное в ConnectionTimeout, истекает до открытия подключения, происходит ошибка, и ADO отменяет попытку подключения. Если Вы установите свойство в ноль, ADO будет ждать бесконечно, пока подключение не будет открыто. Удостоверьтесь, что используемый провайдер поддерживает свойство ConnectionTimeout. Свойство доступно для записи только для закрытого соединения.
CommandTimeoutУстанавливает или возвращает число секунд ожидания выполнения команды. Значение по умолчанию — 30. Чтение и запись. Используйте это свойство, если возникают проблемы из-за плотного сетевого трафика или загруженности сервера. Если время, указанное в CommandTimeout, истекает до завершения выполнения команды, происходит ошибка, и ADO отменяет команду. Если Вы установите свойство в ноль, ADO будет ждать бесконечно, пока команда не будет выполнена. Удостоверьтесь, что используемый провайдер поддерживает свойство CommandTimeout. Установка CommandTimeout объекта Connection никак не связана с установкой свойства CommandTimeout объекта Command.
ProviderУстанавливает или возвращает строковое значение, которое содержит имя используемого провайдера. По умолчанию — «MSDASQL». Провайдер может быть также установлен содержанием свойства ConnectionString или параметром метода Open. Определение провайдера в более чем одном месте может иметь непредсказуемые результаты.
DefaultDatabaseУстанавливает или возвращает строковое значение, которое содержит заданную по умолчанию базу данных. Если есть заданная по умолчанию база данных, запросы SQL могут использовать «дисквалифицированный» синтаксис для обращения к объектам в этой базе данных. Чтобы обращаться к объектам из другой базы данных, вы должны «квалифицировать» имена объектов именем этой базы данных. При подключении провайдер записывает заданную по умолчанию базу данных в это свойство. Некоторые провайдеры разрешают только одну такую базу данных на одно подключение, и в этом случае вы не сможете изменить это свойство. Некоторые источники данных и провайдеры могут не поддерживать это свойство, генерируя ошибку или возвращая пустую строку.
CursorLocationОпределяет расположение курсора, т.е. место, где выполняется работа с данными. Возможные значения:

  • adUseNone(1) — курсор не используется (только для совместимости со старыми версиями).
  • adUseServer(2) — курсор на стороне провайдера (по умолчанию).
  • adUseClient(3) — курсор на стороне пользователя. Может предоставлять дополнительные возможности, которые отсутствуют на стороне провайдера.

Изменение свойства CursorLocation не имеет никакого эффекта при уже существующем подключении. Связанные объекты Recordset и курсоры, возвращённые методом Execute, наследуют эту установку. При открытом объекте Recordset это свойство доступно только для чтения.
ModeОпределяет режим доступа для изменения данных в сеансе. Возможные значения:

  • adModeUnknown(0) — режим доступа не установлен или не может быть определён (по умолчанию).
  • adModeRead(1) — режим только для чтения.
  • adModeWrite(2) — режим только для записи.
  • adModeReadWrite(3) — режим для чтения и записи.
  • adModeShareDenyRead(4) — не разрешает открывать соединение на чтение другим пользователям.
  • adModeShareDenyWrite(8) — не разрешает открывать соединение на запись другим пользователям.
  • adModeShareExclusive(12) — не разрешает открывать соединение другим пользователям.
  • adModeShareDenyNone(16) — разрешает открывать соединение с любым видом доступа другим пользователям.

Вы можете установить это свойство только тогда, когда объект Connection закрыт.
ErrorsСодержит коллекцию объектов Error. Любая инструкция, использующая объекты ADO, может сгенерировать одну или более ошибок провайдера. Когда происходит ошибка, в эту коллекцию могут быть помещены один или более объектов Error. Если следующая подобная инструкция также сгенерирует ошибку, коллекция будет очищена и заполнена заново. Каждый объект Error представляет определённую ошибку провайдера, но не ошибку ADO (ошибки ADO подвергаются механизму обработки исключительных ситуаций). Используйте метод Clear, чтобы вручную очистить коллекцию Errors. Некоторые свойства и методы возвращают предупреждения, которые появляются как объекты Error в коллекции Errors, при этом не останавливая выполнение программы. Перед тем, как вы вызываете методы Resync, UpdateBatch или CancelBatch объекта Recordset, метод Open объекта Connection, или устанавливаете свойство Filter объекта Recordset, вызовите метод Clear коллекции Errors. После этого вы можете прочитать свойство Count коллекции Errors, чтобы проверить возвращенные предупреждения.
StateСодержит состояние объекта. Только чтение. Свойство State может принимать следующие значения:

  • adStateClosed(0) — объект закрыт.
  • adStateOpen(1) — объект открыт.
  • adStateConnecting(2) — объект соединяется.
  • adStateExecuting(4) — объект выполняет команду.
  • adStateFetching(8) — объект выполняет выборку строк.

PropertiesСодержит коллекцию динамических свойств соединения (объектов Property). Подробнее — см. раздел «Динамические свойства объектов».
Open(ConnectionString, UserID, Password, Options)Открывает сеанс подключения к источнику данных. Параметры:

  • ConnectionString — необязательный. Строка, определяющая параметры подключения к источнику данных. Автоматически наследует значение свойства ConnectionString объекта Connection. Вы можете или установить свойство ConnectionString объекта Connection перед вызовом метода Open, или использовать параметр ConnectionString метода Open.
  • UserID — необязательный. Имя пользователя, используемое при соединении.
  • Password — необязательный. Пароль пользователя.
  • Options — необязательный. Способ подключения к источнику данных. Возможные значения:
    • adAsyncConnect(16) — открывает подключение асинхронно. Чтобы определить, когда подключение станет доступным, можно обрабатывать событие ConnectComplete.
    • adConnectUnspecified(-1) — по умолчанию. Открывает подключение синхронно.

Если вы передаете информацию о пользователе и пароле как в строке ConnectionString, так и в параметрах UserID и Password, параметры UserID и Password имеют приоритет. Закончив ваши операции с открытым подключением, используйте метод Close() для освобождения всех связанных системных ресурсов.
Close()Закрывает соединение с источником данных. Закрытие объекта не приводит к удалению его из памяти. Можно изменить свойства объекта, а затем открыть его снова. При закрытии подключения закрываются также все активные наборы записей (объекты Recordset) для данного подключения. Объекты Command, связанные с данным подключением, уже не будут связаны с данным объектом Connection. Закрытие объекта Connection во время транзакции генерирует ошибку и ADO автоматически откатывает транзакцию.
Execute(CommandText, RecordsAffected, Options)Выполняет запрос, оператор SQL, хранимую процедуру или любую другую команду, доступную провайдеру. Возвращает объект Recordset, доступный только для чтения курсором Forward-only, если переданная команда возвращает записи. (Если нужен объект Recordset, доступный для записи, следует создать его непосредственно, и воспользоваться его свойствами и методами.) Параметры:

  • CommandText — обязательный. Строка, содержащая оператор SQL, имя таблицы, хранимой процедуры или другую команду провайдера.
  • RecordsAffected — необязательный. Целое число (long), определяющее число записей, затронутых командой. Заполняется провайдером.
  • Options — необязательный. Целое число (long), определяющее тип команды. Возможные значения (значения можно суммировать):
    • adCmdText(1) — текстовое определение команды или хранимой процедуры.
    • adCmdTable(2) — создать SQL-запрос, который вернёт все строки указанной таблицы.
    • adCmdStoredProc(4) — хранимая процедура.
    • adCmdUnknown(8) — тип команды неизвестен (по умолчанию).
    • adAsyncExecute(16) — асинхронное выполнение команды.
    • adExecuteNoRecords(128) — не возвращать строки.

Cancel()Отменяет выполнение последнего асинхронного вызова Execute() или Open(), если действие ещё не завершено.
ConnectComplete(pError, adStatus, pConnection)Событие возникает после того, как осуществлено подключение к источнику данных. Параметры:

  • pError — содержит объект Error, если произошли ошибки (свойство adStatus равно adStatusErrorsOccurred(2))
  • adStatus — определяет состояние соединения. Возможные значения (для всех событий):
    • adStatusOK(1) — операция произведена успешно.
    • adStatusErrorsOccurred(2) — операция потерпела неудачу.
    • adStatusCantDeny(3) — операция не может быть отменена.
    • adStatusCancel(4) — произошла отмена операции.
    • adStatusUnwantedEvent(5) — предотвращает последующие уведомления до завершения выполнения метода события.
  • pConnection — объект Connection, который вызвал событие.

Disconnect(adStatus, pConnection)Событие возникает после того, как прервано подключение к источнику данных. Параметры аналогичны параметрам события ConnectComplete.
InfoMessage(pError, adStatus, pConnection)Событие возникает каждый раз, когда генерируется предупреждение (warning). Параметры аналогичны параметрам события ConnectComplete.
WillConnect(ConnectionString, UserID, Password, Options, adStatus, pConnection)Событие возникает перед тем, как осуществлено подключение к источнику данных. Параметры в основном аналогичны параметрам события ConnectComplete. Options — целое число (long), которое указывает способ подключения — adAsyncConnect(16) или adConnectUnspecified(-1). В обработчике события можно изменять параметры подключения.
WillExecute(Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection)Событие возникает перед выполнением команды. Параметры:

  • Source — строка, содержащая оператор SQL или имя хранимой процедуры.
  • CursorType — тип курсора для Recordset, который будет открыт. Тип курсора можно изменять. Возможные значения:
    • adOpenUnspecified(-1) — тип курсора не определён.
    • adOpenForwardOnly(0) — определяет forward-only курсор. То же, что и статический курсор, но вы можете прокручивать записи только вперед. Это оптимизирует выполнение, если вы должны сделать только один проход по Recordset’у.
    • adOpenKeyset(1) — Определяет keyset-курсор. То же, что и динамический курсор, но вы не можете видеть записи, добавляемые другими пользователями, хотя записи, удаляемые другими пользователями, недоступны в вашем Recordset’е. Изменения данных другими пользователями видимы.
    • adOpenDynamic(2) — Определяет динамический курсор. Добавления, изменения и удаления другими пользователями видимы; разрешены все типы движения через Recordset, исключая закладки, если провайдер их не поддерживает.
    • adOpenStatic(3) — Определяет статический курсор. Статическая копия набора записей, которую вы можете использовать, чтобы найти данные или генерировать отчёты. Добавления, изменения или удаления другими пользователями не видимы.
  • LockType — тип блокировки для Recordset, который будет открыт. Возможные значения:
    • adLockUnspecified(-1) — тип блокировки не определён.
    • adLockReadOnly(1) — только для чтения. Вы не можете изменить данные.
    • adLockPessimistic(2) — пессимистическая блокировка. Провайдер гарантирует успешное редактирование записей. Запись блокируется сразу после начала редактирования и до момента сохранения записей.
    • adLockOptimistic(3) — оптимистическая блокировка. Провайдер осуществляет блокировку записей только в момент сохранения изменений, т.е. когда вы вызываете метод Update().
    • adLockBatchOptimistic(4) — оптимистические пакетные модификации. Требуется для пакетного режима модификации (отложенное сохранение записей).
  • Options — целое число (long), указывающее опции выполнения команды или открытия Recordset’а.
  • adStatus — определяет состояние события. Возможные значения — см. описание аналогичного параметра события ConnectComplete.
  • pCommand — объект Command, для которого применяется это событие.
  • pRecordset — объект Recordset, для которого применяется это событие.
  • pConnection — объект Connection, для которого применяется это событие.

Событие WillExecute может произойти из-за вызовов Connection.Execute, Command.Execute, или Recordset.Open. Параметр pConnection всегда содержит ссылку на объект Connection. Если событие происходит из-за вызова Connection.Execute, параметры pRecordset и pCommand будут установлены в Nothing. Если событие происходит из-за вызова Recordset.Open, параметр pRecordset будет содержать ссылку на объект Recordset, а параметр pCommand будет установлен в Nothing. Если событие происходит из-за вызова Command.Execute, параметр pCommand будет содержать ссылку на объект Command, а параметр pRecordset будет установлен в Nothing.
ExecuteComplete(RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection)Событие происходит после завершения работы команды. Параметр RecordsAffected — целое число (long) — содержит количество записей, которые затрагивает команда. Остальные параметры аналогичны одноимённым параметрам описанных выше других событий. Событие ExecuteComplete может произойти вследствие вызовов Connection.Execute, Command.Execute, Recordset.Open, Recordset.Requery или Recordset.NextRecordset.
BeginTrans()

RollbackTrans()

Вызов метода BeginTrans начинает новую транзакцию. Провайдеры, которые поддерживают вложенные транзакции, при вызове метода BeginTrans в пределах открытой транзакции начинают новую, вложенную транзакцию. Возвращаемое методом BeginTrans значение указывает уровень вложения: возвращаемое значение «1» указывает, что вы открыли транзакцию верхнего уровня (то есть транзакция не вложена в пределах другой транзакции), «2» указывает, что вы открыли транзакцию второго уровня (транзакция, вложенная в пределах транзакции верхнего уровня), и т.д.

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

BeginTransComplete(TransactionLevel, pError, adStatus, pConnection)

CommitTransComplete(pError, adStatus, pConnection)

RollbackTransComplete(pError, adStatus, pConnection)

Эти события вызываются после того, как заканчивает выполняться соответствующая операция (по работе с транзакциями) на объекте Connection.
OpenSchema(QueryType, Criteria, SchemaID)Получает информацию схемы базы данных от провайдера. Возвращает объект Recordset. Recordset будет открыт как статический курсор только для чтения. Параметры:

  • QueryType — число, тип запроса схемы. Подробнее — см. MSDN, описание перечисления «SchemaEnum».
  • Criteria — необязательный. Массив ограничений запроса (фильтр). Подробнее — см. MSDN.
  • SchemaID — GUID для запроса схемы провайдера, не определенной спецификацией. Этот параметр требуется, если QueryType установлен в adSchemaProviderSpecific(-1); иначе этот параметр не используется.

Объект Error содержит информацию об ошибках доступа к данным, которые принадлежат отдельной операции провайдера. Вы можете обратиться к свойствам объекта Error, чтобы получить информацию о каждой ошибке:

Описание
Description Содержит строку, определяющую короткое описание ошибки. Это свойство по умолчанию.
Number Содержит уникальный код, определяющий тип ошибки (целое число).
Source Идентифицирует имя объекта, который вызвал ошибку (строка).
SQLState Содержит строку из пяти символов, которая указывает код ошибки по стандарту SQL ANSI.
NativeError Содержит определённый провайдером код ошибки (целое число).

Подключаемся к базе данных и выполняем запрос с помощью объекта Connection:

Работаем с ошибками провайдера:

Пример асинхронного подключения и обработки событий:

Пример асинхронного выполнения запроса и обработки событий:

Пример работы с транзакциями:

Пример работы с методом OpenSchema:

Динамические свойства объектов

Объекты Connection, Command, Recordset, Parameter и Field имеют встроенную коллекцию Properties, содержащую объекты Property. Коллекция имеет следующие свойства и методы:

  • Count — содержит количество объектов в коллекции.
  • Item(index) — возвращает элемент коллекции по имени или порядковому номеру.
  • Refresh() — обновляет коллекцию, чтобы отразить доступные объекты, определённые провайдером.

Объект Property представляет динамические характеристики объекта ADO, которые определяются провайдером данных. Объект Property обладает следующими свойствами:

Описание
NameСодержит имя свойства (строка).
TypeСодержит тип свойства. Может принимать значения перечисления DataTypeEnum (подробнее — см. MSDN, а также свойство Type объекта Parameter в данной статье).
ValueСодержит значение свойства.
AttributesСодержит одну или несколько характеристик свойства — сумму одной или более констант:

  • adPropNotSupported(0) — провайдер не поддерживает это свойство.
  • adPropRequired(1) — пользователь должен задать значение данного свойства перед инициализацией источника данных.
  • adPropOptional(2) — пользователю не требуется задавать значение данного свойства перед инициализацией источника данных.
  • adPropRead(512) — данное свойство доступно для чтения.
  • adPropWrite(1024) — пользователь может задать значение данному свойству.

Вы можете изменять значения (Value) этих свойств, но не их характеристики (Attributes). Вы не можете удалить такое свойство.

Чтение коллекции Properties:


Смена текущей базы данных с помощью коллекции Properties:

Объект Command

Объект Command создаётся следующим образом:

Set objComm = CreateObject(«ADODB.Command»)

После этого вы можете вызывать и использовать методы и свойства этого объекта.

Объект Command существует для задания и выполнения команд и запросов. Хотя запрос можно выполнить и без использования объекта Command (с помощью метода Execute объекта Connection или метода Open объекта Recordset), объект Command незаменим при выполнении запроса с параметрами и удобен в случае, когда требуется сохранить текст команды для её повторного использования. Объект Command может быть использован как в паре с объектом Connection, так и без него, т.к. строку подключения можно задать непосредственно в свойстве ActiveConnection объекта Command.

Свойства и методы объекта Command:

Описание
ActiveConnectionОпределяет объект Connection, с которым связан данный объект Command. Значением этого свойства может быть и строка, содержащая ту же информацию, что и свойство ConnectionString объекта Connection. Попытка выполнить метод Execute объекта Command при незаданном свойстве ActiveConnection приведёт к ошибке. Назначение закрытого объекта Connection в качестве значения свойства ActiveConnection также вызовет ошибку (объект должен быть открыт). Закрытие объекта Connection, с которым связан объект Command, устанавливает свойство ActiveConnection в Nothing.
CommandTextСтрока, определяющая текст команды, например, оператор SQL, имя таблицы или вызов хранимой процедуры. В зависимости от установки свойства CommandType, ADO может автоматически изменить свойство CommandText.
CommandTimeoutУстанавливает или возвращает число секунд ожидания выполнения команды. Значение по умолчанию — 30. Чтение и запись. Используйте это свойство, если возникают проблемы из-за плотного сетевого трафика или загруженности сервера. Если время, указанное в CommandTimeout, истекает до завершения выполнения команды, происходит ошибка, и ADO отменяет команду. Если Вы установите свойство в ноль, ADO будет ждать бесконечно, пока команда не будет выполнена. Удостоверьтесь, что используемый провайдер поддерживает свойство CommandTimeout. Установка CommandTimeout объекта Connection никак не связана с установкой свойства CommandTimeout объекта Command.
CommandTypeОпределяет тип команды. Возможные значения:

  • adCmdUnspecified(-1) — тип команды не определён.
  • adCmdText(1) — текстовое определение команды или хранимой процедуры.
  • adCmdTable(2) — создать SQL-запрос, который вернёт все строки указанной таблицы.
  • adCmdStoredProc(4) — хранимая процедура.
  • adCmdUnknown(8) — тип команды неизвестен (по умолчанию).

Если значение свойства равно adCmdUnknown (по умолчанию), команды могут выполняться медленнее, потому что ADO должна делать запросы провайдеру, чтобы определить, является ли CommandText инструкцией SQL, хранимой процедурой или именем таблицы. Если свойство CommandType не соответствует типу команды в свойстве CommandText, при вызове метода Execute происходит ошибка.
PreparedУказывает, сохранить ли откомпилированную версию команды перед первым выполнением (true или false). Это может замедлить первое выполнение команды, но ускорит любое последующее выполнение. Если провайдер не поддерживает компиляцию команды, при установке этого свойства в true может произойти ошибка (или автоматическая установка в false).
StateСодержит состояние объекта. Только чтение. Возможные значения:

  • adStateClosed(0) — объект закрыт.
  • adStateOpen(1) — объект открыт.
  • adStateConnecting(2) — объект соединяется.
  • adStateExecuting(4) — объект выполняет команду.
  • adStateFetching(8) — объект выполняет выборку строк.

Свойство State может иметь комбинацию значений. Например, если асинхронно выполняется инструкция, это свойство будет иметь объединенное значение adStateOpen и adStateExecuting.
PropertiesСодержит коллекцию динамических свойств объекта (объектов Property). Подробнее — см. раздел «Динамические свойства объектов».
ParametersСодержит коллекцию параметров объекта (объектов Parameter). Использование метода Refresh() этой коллекции отыскивает информацию параметров для хранимой процедуры или параметрического запроса. Некоторые провайдеры не поддерживают хранимые процедуры или параметрические запросы; в этом случае вызов метода Refresh() вызовет ошибку. Перед вызовом метода Refresh() вы должны правильно установить значения свойств ActiveConnection, CommandText и CommandType. Если вы обращаетесь к коллекции перед вызовом метода Refresh(), ADO автоматически вызовет его и заполнит коллекцию. Коллекция параметров имеет следующие свойства и методы:

  • Count — содержит количество объектов в коллекции.
  • Item(index) — возвращает элемент коллекции по имени или порядковому номеру.
  • Append(object) — добавляет предварительно созданный объект в коллекцию.
  • Delete(index) — удаляет элемент из коллекции по имени или порядковому номеру.
  • Refresh() — обновляет коллекцию, чтобы отразить доступные объекты, определённые провайдером.

NamedParametersУказывает, нужно ли передавать провайдеру имена параметров. Булево (по умолчанию — ложь). Если это свойство установлено в True, ADO передаёт значение имени каждого параметра в коллекции параметров. Провайдер использует имя параметра, чтобы установить соответствие параметрам в свойстве CommandText. Если это свойство установлено в ложь, имена параметров игнорируются, и провайдер использует порядок параметров, чтобы установить соответствие параметрам в свойстве CommandText.
Execute(RecordsAffected, Parameters, Options)Выполняет запрос, оператор SQL, хранимую процедуру или любую другую команду, доступную провайдеру. В основном аналогичен методу Execute() объекта Connection (см. выше). Все параметры являются необязательными. Параметр «Parameters» представляет собой массив параметров типа Variant, передаваемый оператору SQL (не для выходных параметров).
Cancel()Отменяет выполнение последнего асинхронного вызова Execute(), если действие ещё не завершено.
CreateParameter(Name, Type, Direction, Size, Value)Создаёт и возвращает объект Parameter с заданными свойствами. Метод CreateParameter не добавляет созданный параметр к коллекции Parameters. Для этого следует использовать метод Append(objParameter) этой коллекции. Аргументы метода CreateParameter (все аргументы необязательные):

  • Name — строка, имя параметра.
  • Type — целое число (long), тип данных параметра (строка, число, булево и т.д.). Подробнее — см. в MSDN значения перечисления DataTypeEnum, а также свойство Type объекта Parameter в данной статье.
  • Direction — целое число (long), «направление» параметра. Возможные значения:
    • adParamUnknown(0) — направление параметра неизвестно.
    • adParamInput(1) — по умолчанию, входной параметр.
    • adParamOutput(2) — выходной параметр.
    • adParamInputOutput(3) — параметр представляет собой и входной, и выходной параметр
    • adParamReturnValue(4) — параметр представляет собой возвращаемое значение.
  • Size — целое число (long), максимальная длина параметра в символах или байтах.
  • Value — Variant, значение параметра.

Объект Parameter является членом коллекции Parameters и представляет собой параметр запроса с параметрами (например, критерий сравнения предложения WHERE оператора SELECT) или параметр хранимой процедуры. В зависимости от функциональных возможностей провайдера некоторые методы или свойства объекта Parameter могут быть недоступны. Если вы знаете имена и свойства параметров, связанных с хранимой процедурой или параметризованным запросом, вы можете использовать метод CreateParameter для создания объектов Parameter и метод Append() для добавления их к коллекции параметров. Это позволит вам не вызывать метод Refresh() коллекции параметров, чтобы отыскать информацию о параметрах с помощью провайдера (потенциально ресурсоёмкая операция). Свойства и методы объекта Paramrter:

Описание
NameСтрока, имя параметра. Для объектов Parameter, ещё не добавленных в коллекцию параметров, это свойство доступно для чтения и записи, в противном случае — только для чтения.
ValueVariant, значение параметра. Если команда содержит параметр, свойство Value которого пусто, и вы получаете от команды объект Recordset, вы должны закрыть Recordset перед чтением свойства Value. Иначе (для некоторых провайдеров) свойство Value может не содержать правильное значение.
AttributesСодержит сумму одной или более характеристик объекта (целое число, long). Чтение и запись. Возможные значения:

  • adParamSigned(16) — параметр принимает значения со знаком.
  • adParamNullable(64) — параметр принимает пустые значения.
  • adParamLong(128) — параметр принимает двоичные данные.

DirectionЦелое число (long), «направление» параметра. Возможные значения — см. описание метода CreateParameter объекта Command. Не все провайдеры могут определить направление параметров в их хранимых процедурах. В таких случаях вы должны установить свойство Direction прежде, чем выполните запрос.
PrecisionУказывает степень точности для числовых значений. Целое число (byte), которое указывает максимальное число цифр.
NumericScaleУказывает масштаб числовых значений. Целое число (byte), которое указывает число десятичных разрядов справа от десятичной точки.
SizeЦелое число (long), максимальная длина параметра в символах или байтах. Во многих случаях во избежание ошибок крайне желательно заполнить этот параметр.
TypeЦелое число (long), тип данных параметра (строка, число, булево и т.д.). Подробнее — см. в MSDN значения перечисления DataTypeEnum. Некоторые возможные значения:

  • adEmpty(0) — значение не задано.
  • adSmallInt(2) — двухбайтное целое со знаком.
  • adInteger(3) — четырёхбайтное целое со знаком.
  • adSingle(4) — число с плавающей запятой с одинарной точностью.
  • adDouble(5) — число с плавающей запятой с двойной точностью.
  • adCurrency(6) — денежная сумма с фиксированной точкой с четырьмя цифрами справа от десятичной точки (восьмибайтное целое число со знаком).
  • adError(10) — 32-битный код ошибки.
  • adBoolean(11) — булево значение.
  • adDecimal(14) — числовое значение с фиксированной точностью и масштабом.
  • adTinyInt(16) — однобайтное целое со знаком.
  • adUnsignedTinyInt(17) — однобайтное целое без знака.
  • adUnsignedSmallInt(18) — двухбайтное целое без знака.
  • adUnsignedInt(19) — четырёхбайтное целое без знака.
  • adBigInt(20) — восьмибайтное целое со знаком.
  • adUnsignedBigInt(21) — восьмибайтное целое без знака.
  • adBinary(128) — двоичное значение.
  • adChar(129) — строковое значение.
  • adUserDefined(132) — определяемая пользователем переменная.
  • adDBDate(133) — дата формата yyyymmdd.
  • adDBTime(134) — время формата hhmmss.
  • adDBTimeStamp(135) — дата и время формата yyyymmddhhmmss плюс тысячные доли секунды.

AppendChunk(Data)Добавляет данные в конец большого текста или двоичных данных. Параметр Data имеет тип Variant. В ситуациях, когда системная память ограничена, вы можете использовать метод AppendChunk для управления большими значениями по частям. Первый вызов AppendChunk() перезаписывает новые данные поверх любых существующих данных. Последующие вызовы AppendChunk() добавляют данные к существующим данным параметра. Вызов AppendChunk() с пустым значением удаляет все данные параметра.
PropertiesСодержит коллекцию динамических свойств объекта (объектов Property). Подробнее — см. раздел «Динамические свойства объектов».

Пример «независимого» использования объекта Command:

Пример использования объекта Command в паре с объектом Connection:

Пример получения информации о параметрах хранимой процедуры:

Пример исполнения хранимой процедуры с параметрами — упаковка файла в CAB-архив средствами SQL-сервера:

Объект Recordset

Объект Recordset создаётся следующим образом:

Set objConn = CreateObject(«ADODB.Recordset»)

После этого вы можете вызывать и использовать методы и свойства этого объекта. Объект Recordset состоит из записей и полей. Не все свойства объекта поддерживаются всеми провайдерами.

При открытии набора записей (Recordset’а) вы должны определить тип используемого курсора. В библиотеке ADO определены четыре типа курсоров:

  • Динамический курсор (Dynamic cursor). Позволяет видеть данные, добавленные, изменённые и удалённые другими пользователями. Допускает все типы переходов по набору записей, а также использование закладок, если это позволяет провайдер.
  • Курсор набора данных (Keyset cursor). Позволяет видеть данные, изменённые другими пользователями. Допускает все типы переходов по набору записей, а также использование закладок, если это позволяет провайдер.
  • Статический курсор (Static cursor). Позволяет получить копию набора записей для создания отчёта. Допускает все типы переходов по набору записей, а также использование закладок, если это позволяет провайдер.
  • Курсор Forward-only (Forward-only cursor). Аналогичен предыдущему, но позволяет проходить через набор записей только вперёд. Обеспечивает максимальную производительность.

Чтобы открыть набор записей в одном из рассмотренных четырёх режимов, необходимо задать соответствующее значение свойству CursorType или параметру CursorType метода Open. Не все провайдеры поддерживают все типы курсоров. По умолчанию используется курсор типа Forward-only.

При открытии объекта Recordset текущей записью становится первая запись, а свойства EOF и BOF получают значение False.

Объект Recordset предусматривает два типа обновлений: немедленное и пакетное. В первом случае все изменения данных немедленно записываются в базу после вызова метода Update(). Во втором случае (если тип блокировки для Recordset — adLockBatchOptimistic(4), режим обновления будет пакетным) несколько обновлённых строк может помещаться в локальный буфер, после чего реализуется одновременное обновление нескольких полей источника данных с помощью метода UpdateBatch().

Свойства и методы объекта Recordset:

Описание
ActiveConnectionСодержит объект Connection, к которому привязан данный Recordset, или строку параметров подключения (ConnectionString).
ActiveCommandСодержит объект Command, который породил данный Recordset. Только чтение. Если объект Command не использовался, пусто.
SourceСодержит источник данных объекта Recordset. Это ссылка на объект Command, оператор SQL, имя таблицы или хранимой процедуры. Свойству можно задать значение только при закрытом в данный момент объекте Recordset.
FilterСодержит фильтр данных. Может принимать значения трёх типов:

  • Строка, составленная из одного или более индивидуальных предложений с операторами AND или OR, например «LastName = ‘Smith’ AND FirstName = ‘John'».
  • Массив закладок — уникальных значений Bookmark.
  • Одно из значений перечисления FilterGroupEnum (подробнее — см. MSDN).

Используйте это свойство для выборочного сканирования объекта Recordset. Установка свойства переместит курсор на первую запись, которая удовлетворяет фильтру.
CursorTypeСодержит тип курсора. Может быть изменено только до открытия объекта Recordset. Возможные значения — см. описание аргумента CursorType события WillExecute объекта Connection.
LockTypeСодержит тип блокировки для объекта Recordset. Доступно для записи при закрытом объекте Recordset. Возможные значения — см. описание аргумента LockType события WillExecute объекта Connection.
MaxRecordsИспользуйте это свойство, чтобы ограничить количество записей, которые возвращает провайдер в результате запроса к источнику данных. По умолчанию — 0, что означает, что провайдер возвращает все требуемые записи.
StateСодержит состояние объекта. Возможные значения — см. описание свойства State объекта Command.
CacheSizeУстанавливает количество записей объекта Recordset (обязательно больше 0), которые кэшируются (локально) в памяти. Значение по умолчанию 1. Например, если CacheSize = 10, после открытия объекта Recordset провайдер помещает первые 10 записей в локальную память. По мере того, как вы двигаетесь по записям объекта Recordset, провайдер возвращает данные из локального буфера памяти. Как только вы минуете последнюю запись в кэше, провайдер помещает следующие 10 записей из источника данных в кэш. Записи в кэше не отражают изменения, которые делают другие пользователи. Чтобы вызвать модификацию всех кэшируемых данных, используйте метод Resync().
Open(Source, ActiveConnection, CursorType, LockType, Options)Открывает курсор. Все параметры необязательные. Параметры:

  • Source — может принимать следующие значения:
    • Ссылка на объект Command.
    • Строка с оператором SQL, именем таблицы или хранимой процедуры.
    • Имя файла с сохранённым набором записей.
  • ActiveConnection — ссылка на объект Connection или строка параметров подключения (ConnectionString).
  • CursorType — тип курсора. Возможные значения — см. описание аргумента CursorType события WillExecute объекта Connection.
  • LockType — тип блокировки записей. Возможные значения — см. описание аргумента LockType события WillExecute объекта Connection.
  • Options — целое число (long), определяющее тип команды. Возможные значения (значения можно суммировать):
    • adCmdText(1) — текстовое определение команды или хранимой процедуры.
    • adCmdTable(2) — создать SQL-запрос, который вернёт все строки указанной таблицы.
    • adCmdStoredProc(4) — хранимая процедура.
    • adCmdUnknown(8) — тип команды неизвестен (по умолчанию).
    • adAsyncExecute(16) — асинхронное выполнение команды. Нельзя сочетать с adCmdTableDirect(512).
    • adAsyncFetch(32) — строки, не находящиеся в кеше (размер кеша определяется свойством CacheSize), будут выбраны асинхронно.
    • adAsyncFetchNonBlocking(64) — никогда не осуществлять блокировки при поиске.
    • adCmdFile(256) — имя файла с сохранённым набором записей.
    • adCmdTableDirect(512) — создать SQL-запрос, который вернёт все строки указанной таблицы. Позволяет использовать метод Seek() в паре со свойством Index (в данной статье не рассматриваются), если используется курсор на стороне сервера.

По умолчанию Recordset будет открыт с курсором forward-only read-only на стороне сервера.
Close()Закрывает объект Recordset. Если вы закрываете объект Recordset в пакетном режиме модификации, все изменения после последнего вызова UpdateBatch() будут потеряны.
RecordCountСодержит количество записей в объекте Recordset. Если провайдер или тип курсора не поддерживает данное свойство, содержит -1.
Requery(Options)Обновляет данные в объекте Recordset путём повторного выполнения запроса. Эквивалентно вызову Close(), а затем Open(). Возможные значения параметра Options — см. описание аргумента Options метода Open() объекта Recordset.
Resync(AffectRecords, ResyncValues)Обновляет данные в объекте Recordset. Не выполняет повторного запроса к базе данных, поэтому вновь добавленные записи не будут видны. Если существующие записи были удалены из базы данных, произойдёт ошибка. Этот метод обычно используют со статическим курсором или курсором типа Forward-only, чтобы видеть изменения, внесённые в базу данных. Параметры (все параметры необязательные):

  • AffectRecords — определяет записи, на которые воздействует метод. Возможные значения:
    • adAffectCurrent(1) — обновляет только текущую запись.
    • adAffectGroup(2) — обновляет все записи, удовлетворяющие фильтру, заданному свойством Filter (например, если Filter — массив «закладок»).
    • adAffectAll(3) — по умолчанию. Обновляет все записи. Однако, если свойство Filter содержит строку типа «Author =’Smith'», то операция затронет только часть записей.
    • adAffectAllChapters(4) — обновляет все записи.
  • ResyncValues — определяет возможность перезаписи значений основной таблицы. Возможные значения:
    • adResyncAllValues(2) — по умолчанию. Осуществляет перезапись данных с отменой отложенных обновлений.
    • adResyncUnderlyingValues(1) — изменённые данные не перезаписываются и отложенные обновления не отменяются.

Save(FileName, PersistFormat)Сохраняет набор записей в файл или объект Stream (не рассматривается в данной статье). Может быть вызван только для открытого набора записей. После вызова метода текущей становится первая строка набора записей. Параметры (все параметры необязательные):

  • FileName — полное имя файла, в котором будет сохранён набор записей, или ссылка на объект Stream. По умолчанию используется свойство Source как имя файла. В принципе, сюда можно поместить ссылку на любой объект, который поддерживает OLE DB IStream интерфейс, например, MSXML DOM object («MSXML.DOMDocument»).
  • PersistFormat — формат, в котором будет сохранён набор записей. Возможные значения:
    • adPersistADTG(0) — по умолчанию. Формат Microsoft Advanced Data TableGram (ADTG).
    • adPersistXML(1) — специфический формат XML ADO в кодировке UTF-8.
    • adPersistProviderSpecific(2) — собственный формат провайдера.

Если установлено свойство Filter, будут сохранены только записи, удовлетворяющие фильтру.
Clone(LockType)Возвращает копию исходного объекта Recordset. Необязательный параметр LockType определяет тип блокировки: как у оригинала или только для чтения. Допустимые значения — adLockUnspecified(-1) или adLockReadOnly(1). Использование метода Clone() более эффективно, чем создание и открытие нового объекта Recordset с теми же параметрами. Свойство Filter оригинала не будет применено к клону. Текущей записью только что созданного клона будет первая. Изменения, которые вы делаете в оригинальном объекте Recordset, видимы во всех его клонах независимо от типа курсора. Однако после того, как вы выполните метод Requery() на оригинале, клоны больше не будут синхронизированы с оригиналом. Закрытие оригинала не закрывает копии. Значения закладок (Bookmark) взаимозаменяемы для оригинала и клонов. Некоторые события объекта Recordset (объект Recordset имеет события — в данной статье они не рассматриваются) будут происходить одновременно для всех клонов. Однако, поскольку текущая запись оригинала может отличаться от текущей записи клона, события могут быть неверно обработаны для клона.
BOF
EOF
Если свойство BOF содержит True, текущая запись (курсор) находится перед первой записью в объекте Recordset. Если свойство EOF содержит True, текущая запись (курсор) находится после последней записи в объекте Recordset. При открытии пустого объекта Recordset оба этих свойства содержат True.
Move(NumRecords, Start)Передвигает позицию текущей записи в наборе записей. Параметры:

  • NumRecords — целое число (long), количество записей, на которое перемещается позиция. При использовании отрицательных значений позиция передвигается назад.
  • Start — необязательный. Может быть закладкой, с которой начинается отсчёт (см. свойство Bookmark). Другие возможные значения:
    • adBookmarkCurrent(0) — от текущей записи (по умолчанию).
    • adBookmarkFirst(1) — от первой записи.
    • adBookmarkLast(2) — от последней записи.

Вызов метода для пустого набора записей приведёт к ошибке.
MoveFirst()
MoveLast()
MoveNext()
MovePrevious()
Передвигают позицию текущей записи соответственно на первую, последнюю, следующую или предыдущую запись. Вызов MoveFirst() в объекте Recordset типа forward-only может заставить провайдера заново выполнить команду, которая сгенерировала этот Recordset.
AbsolutePositionПри установке перемещает курсор на запись под данным номером. Доступно не для всех видов курсоров. Значение в интервале с 1 по RecordCount. Свойство поддерживается не всеми провайдерами.
BookmarkЗакладка в виде числа. Доступно не для всех видов курсоров. Никак не связана с номером записи. Можно при проходе по таблице запомнить значение Bookmark во временной переменной, а затем вернуться обратно на данную запись путём установки свойства из этой переменной. Закладка уникально идентифицирует запись. Тип данных закладки определяется провайдером и воспринимается ADO как Variant.
PageSizeЗадаёт число записей на странице. По умолчанию — 10. Доступно не для всех видов курсоров.
PageCountСодержит количество страниц. Автоматически пересчитывается при изменении PageSize. Доступно не для всех видов курсоров.
AbsolutePageПри установке перемещает курсор на начало данной страницы. Доступно не для всех видов курсоров. Значение в интервале с 1 по PageCount. Свойство поддерживается не всеми провайдерами.
Delete(AffectRecords)Удаляет текущую запись или группу записей. Если объект Recordset не допускает удаления записей, произойдёт ошибка. Если вы находитесь в пакетном режиме модификации, фактическое удаление происходит при вызове UpdateBatch(). Вы можете отменить удаление вызовом CancelBatch(). Параметр AffectRecords (необязательный) может принимать значения:

  • adAffectCurrent(1) — удаляется текущая запись (по умолчанию).
  • adAffectGroup(2) — удаляются все записи, удовлетворяющие фильтру, заданному свойством Filter.

AddNew(Fields, Values)Добавляет запись с указанными значениями полей в конец объекта Recordset и делает её текущей. Параметры (все параметры необязательные):

  • Fields — имя поля или массив имён полей, для которых задаются значения.
  • Values — значение поля или массив значений полей.

Чтобы сохранить добавленную запись, необходимо вызвать метод Update(). При непосредственном режиме модификации, если вы передаете параметры Fieldlist и Values, ADO немедленно отправляет новую запись в базу данных (вызов Update() не нужен). В пакетном режиме модификации для сохранения записи в базе данных нужно вызвать метод UpdateBatch().
Update(Fields, Values)Сохраняет любые изменения текущей записи объекта Recordset. Параметры (все параметры необязательные):

  • Fields — имя поля или массив имён полей, в которых следует сохранить изменения.
  • Values — значение поля или массив значений полей.

Если курсор перемещён с добавленной или изменённой записи, метод вызывается автоматически.
CancelUpdate()Отменяет любые изменения или добавления записей, проведённые до использования метода Update().
UpdateBatch(AffectRecords, PreserveStatus)Для пакетного режима модификации: записывает все изменения объекта Recordset в базу данных. Только для курсоров Keyset или Static. Если вызов метода привёл к ошибкам из-за конфликта с основными данными (например, запись была уже удалена другим пользователем), используйте коллекцию Errors и обрабатывайте ошибки времени выполнения (run-time errors). Используйте свойства Filter и Status, чтобы определить местонахождение записей с конфликтами. Чтобы отменить все ожидающие разрешения пакетные модификации, используйте метод CancelBatch(). Порядок, в котором модификации выполняются на источнике данных, не обязательно тот же, в котором эти модификации были выполнены в текущем объекте Recordset. Параметры (все параметры необязательные):

  • AffectRecords — указывает, какие записи затронет метод. Возможные значения — см. описание аргумента AffectRecords метода Resync().
  • PreserveStatus — если установлено в True, свойство Status каждой записи остаётся неизменным.

CancelBatch(AffectRecords)Отменяет любые ожидающие разрешения модификации в пакетном режиме модификации. Обработка ошибок аналогична методу UpdateBatch(). Необязательный параметр AffectRecords указывает, какие записи затронет метод. Возможные значения — см. описание аргумента AffectRecords метода Resync().
StatusСодержит статус текущей записи относительно пакетных модификаций или других объёмных операций. Возможные значения — см. в MSDN описание перечисления RecordStatusEnum.
SetAllRowStatus(recStatus)Устанавливает свойство Status всех записей к указанному значению. Единственное допустимое значение аргумента recStatus — adRecNew(1) — указывает, что запись новая.
EditModeСодержит состояние редактирования текущей записи (был ли вызван метод Update() или UpdateBatch() для сохранения изменений). Возможные значения:

  • adEditNone(0) — редактирование не проводилось.
  • adEditInProgress(1) — редактирование проводилось, но изменения не сохранены.
  • adEditAdd(2) — текущая запись добавлена с помощью метода AddNew(), но ещё не сохранена.
  • adEditDelete(4) — текущая запись была удалена.

Cancel()Отменяет последний асинхронный вызов Open(), если процесс ещё не завершён.
FieldsСодержит коллекцию полей (объектов Field). Свойства и методы коллекции — см. раздел «Коллекция полей Fields».
PropertiesСодержит коллекцию динамических свойств объекта (объектов Property). Подробнее — см. раздел «Динамические свойства объектов». Доступно для открытого объекта Recordset.
CursorLocationОпределяет расположение курсора (на сервере или на клиенте). Доступно для установки только до осуществления подключения к источнику данных. Возможные значения:

  • adUseNone(1) — не использовать курсор (устарело; только ради совместимости).
  • adUseServer(2) — по умолчанию. Курсор на стороне сервера.
  • adUseClient(3) — курсор на стороне клиента. Может обеспечивать дополнительные возможности (например, сортировку).


SortСтрока, содержащая одно или более имен полей, по которым следует отсортировать Recordset, и порядок сортировки (по возрастанию или по убыванию). Каждое имя поля отделяется запятой и произвольно сопровождается пробелом и ключевым словом ASC, которое сортирует в возрастающем порядке, или DESC, которое сортирует по убыванию. По умолчанию сортировка происходит в возрастающем порядке. Это свойство требует, чтобы свойство CursorLocation было установлено в adUseClient(3). Это свойство имеет приоритет перед предложением ORDER BY, включенным в инструкцию SQL. Установка свойства к пустой строке сбросит строки к их первоначальному порядку.
CompareBookmarks(Bookmark1, Bookmark2)Сравнивает относительную позицию двух закладок (см. свойство Bookmark) и возвращает результат сравнения. Возвращаемые значения:

  • adCompareLessThan(0) — первая закладка перед второй.
  • adCompareEqual(1) — закладки равны.
  • adCompareGreaterThan(2) — первая закладка после второй.
  • adCompareNotEqual(3) — закладки не равны и не упорядочены.
  • adCompareNotComparable(4) — закладки не могут быть сравнены.

Закладки должны принадлежать одному и тому же объекту Recordset, или его клону.
NextRecordset(RecordsAffected)Используйте этот метод, чтобы получить результаты следующей команды в составной инструкции, которая возвращает множественные результаты. Если вы открываете объект Recordset, основанный на составной инструкции (например, «SELECT * FROM table1; SELECT * FROM table2»), использование метода Open() возвращает результаты только первой команды. Если результатов следующей команды нет, Recordset будет установлен в Nothing. При непосредственном режиме модификации перед использованием метода NextRecordset следует вызвать Update() или CancelUpdate(), т.к. модификации должны быть завершены. Метод возвращает объект Recordset. В необязательном параметре RecordsAffected возвращается число записей, затронутых операцией.
Supports(CursorOptions)Определяет, поддерживает ли текущий курсор Recordset специфический тип функциональных возможностей и возвращает булево значение. Параметр CursorOptions состоит из одного или более значений:

  • adAddNew(0x1000400) — поддерживает метод AddNew() для добавления записей.
  • adApproxPosition(0x4000) — поддерживает свойства AbsolutePosition и AbsolutePage.
  • adBookmark(0x2000) — поддерживает свойство Bookmark.
  • adDelete(0x1000800) — поддерживает метод Delete() для удаления записей.
  • adFind(0x80000) — поддерживает метод Find() для определения местонахождения строки в Recordset.
  • adHoldRecords(0x100) — отыскивает записи или изменяет позицию, не передавая все ожидающие разрешения изменения.
  • adIndex(0x100000) — поддерживает свойство Index.
  • adMovePrevious(0x200) — поддерживает методы MoveFirst() и MovePrevious(), методы Move() и GetRows() для перемещения текущей позиции назад, не требуя закладок.
  • adNotify(0x40000) — указывает, что провайдер данных поддерживает события объекта Recordset (в данной статье события не рассматриваются).
  • adResync(0x20000) — поддерживает метод Resync.
  • adSeek(0x200000) — поддерживает метод Seek() для определения местонахождения строки в Recordset.
  • adUpdate(0x1008000) — поддерживает метод Update().
  • adUpdateBatch(0x10000) — поддерживает методы UpdateBatch() и CancelBatch().

Find(Criteria, SkipRows, SearchDirection, Start)Ищет в Recordset строку, которая удовлетворяет указанным критериям. Если строка найдена, она становится текущей. Иначе, текущая позиция устанавливается на конец (или начало) Recordset. Перед вызовом метода текущая позиция должна быть установлена. Параметры:

  • Criteria — строка, которая содержит инструкцию, определяющую имя столбца, оператор сравнения и значение. Может быть определено имя только единственного столбца. Оператором сравнения может быть , =, =, <> или «like». Значение может быть строкой, числом с плавающей запятой или датой. Cтроки берутся в одинарные кавычки или # (знаки номера). Даты ограничиваются знаками номера и могут содержать часы, минуты и секунды, но не миллисекунды. Для оператора «like» значение строки может содержать звездочку (*). Звездочка может использоваться только в конце строки значения, или в начале и конце строки одновременно, и никак иначе. Пример: «start_date > #7/22/97#».
  • SkipRows — необязательный. Целое число (long), значение по умолчанию которого является нулевым, которое определяет смещение строки от текущей строки или закладки Start (см. ниже), чтобы начать поиск. По умолчанию, поиск начнётся с текущей строки.
  • SearchDirection — необязательный. Определяет направление поиска. Возможные значения:
    • adSearchBackward(-1) — Поиск назад. Если соответствие не найдено, указатель текущей записи будет установлен в BOF.
    • adSearchForward(1) — Поиск вперёд. Если соответствие не найдено, указатель текущей записи будет установлен в EOF.
  • Start — необязательный. Закладка (Bookmark), которая используется как начальная позиция для поиска.

GetRows(Rows, Start, Fields)Помещает записи объекта Recordset в массив. Возвращает двумерный массив. Параметры:

  • Rows — необязательный. Единственно возможное значение и значение по умолчанию — adGetRowsRest(-1). Отыскивает все записи Recordset от текущей позиции или от закладки, указанной параметром Start.
  • Start — необязательный. Закладка (Bookmark), которая используется как начальная позиция для поиска.
  • Fields — необязательный. Имя или порядковая позиция поля, либо массив имен или порядковых позиций полей. ADO возвращает только данные из этих полей.

GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)Возвращает Recordset как строку. Параметры:

  • StringFormat — формат строки. Единственно возможное значение — adClipString(2) — разграничивает строки, столбцы и пустые значения с помощью параметров RowDelimiter, ColumnDelimiter и NullExpr.
  • NumRows — необязательный. Число строк, которые будут возвращены из Recordset. Если NumRows не определён или превышает общее количество строк в Recordset, будут возвращены все строки.
  • ColumnDelimiter — необязательный. Разделитель столбцов. Если не определено, cимвол табуляции.
  • RowDelimiter — необязательный. Разделитель строк. Если не определено, символ возврата каретки.
  • NullExpr — необязательный. Выражение, используемое вместо пустого значения (Null). Если не определено, пустая строка.

Коллекция полей Fields

Коллекция полей Fields является свойством объекта Recordset и поддерживает следующие свойства и методы:

Описание
CountСодержит количество объектов в коллекции.
Item(index)Возвращает элемент коллекции по имени или порядковому номеру.
Append(Name, Type, DefinedSize, Attrib)Создаёт и добавляет новый объект Field в коллекцию. Поля следует добавлять к закрытому Recordset’у. Параметры:

  • Name — уникальное имя поля.
  • Type — тип поля. Возможные значения — см. описание свойства «Type» объекта «Parameter».
  • DefinedSize — необязательный. Размер поля в символах или байтах.
  • Attrib — необязательный. Атрибуты поля. Возможные значения — см. в MSDN описание перечисления FieldAttributeEnum.

Delete(Field)Удаляет объект Field из коллекции, что соответствует удалению поля из набора записей. Параметр Field задаёт имя объекта Field или его порядковый номер. Метод может использоваться только для закрытого набора записей.

Объект Field

Объект Field представляет собой столбец данных одного типа, т.е. поле набора записей. Кроме того, объект Field может представлять собой поле единичной записи (объекта Record, который не рассматривается в данной статье). Свойства объекта Field:

Описание
Name Содержит имя поля.
Value Содержит значение поля.
OriginalValue Содержит значение поля после последнего вызова Update() или UpdateBatch(). Это то значение, которое используют методы CancelUpdate() и CancelBatch().
UnderlyingValue Содержит текущее значение поля из источника данных.
DefinedSize Содержит максимальный размер поля.
ActualSize Содержит размер фактического значения поля.
Type Содержит тип поля. Возможные значения — см. описание свойства «Type» объекта «Parameter».
Precision Содержит степень точности для числовых значений поля (максимальное количество цифр).
NumericScale Содержит масштаб числовых значений поля (количество десятичных знаков справа от запятой).
Properties Содержит коллекцию динамических свойств объекта (объектов Property). Подробнее — см. раздел «Динамические свойства объектов».

Пример «независимого» использования объекта Recordset:

Подключение к interbase из ADO NET

vs2005 — .NET+C#+MySQL+firebird
В программе один раз считывается файл из базы данных interbase/firebird. При запуске программы сейчас стала появляеться ошибка — не могу найти файл или сборку FirebirdSQL.data.FirebirdClient.dll.
Программа писалась год назад видимо что-то подзабыл. Чтобы посмотреть есть ли ссылка на библиотеку — открываю в vs 2005 — Project/add reference и пытаюсь найти ссылку на закладке .NET и не нахожу. Пытаюсь добавить ссылку через закладку browse — и снова не нахожу появившуюся ссылку.
Программа выполняется без ошибки , если указанная dll лежит в том же каталоге , что и exe файл
Как можно собрать программу, чтобы не требовалось наличие dll в том же каталоге?

На всякий случай код обращения к firebird —

19.04.2011, 12:38

Подключение к Oracle через ado.net по выбранному listener
1) есть 2 лисенера на Оракл сервере. клиентская часть проги(на .NET) должна подключать по .

Удаленный SQL-сервер Ado.Net + .Net remoting + Asp .Net
Всем привет! Нужно написать клиент-серверное приложение на основе Microsoft Sql Server 2005.

Отличия ADO.NET’03 и ADO.NET’05
Друзья, есть ли отличия в технологии ADO.NET для 2003 и для 2005, и насколько они велики? Вопрос.

Подключение к Interbase
Доброго времени суток. Подскажите пожалуйста, есть ли бесплатные библиотеки (.dll) для подключения.

Asp выбор сетевой библиотеки клиента для ado

Для работы с данными ваше приложение может использовать различные технологии. Это Open DataBase Connectivity (ODBC), Data Access Objects (DAO), Remote Data Objects (RDO), ActiveX Data Objects (ADO) и Object Linking and Embedding DataBase (OLE DB). На выбор конкретной технологии больше всего влияния оказывают такие факторы, как функциональность, легкость программирования, удобство сопровождения и производительность. Иногда бывает важно получить доступ к данным «аккуратно», другой раз на первом месте стоит скорость работы с данными. Вопросы удобства и простоты развертывания и сопровождения, думаю, очевидны. Также нужно принимать во внимание возможность работы с одними и теми же данными нескольких пользователей — система должна поддерживать несколько подключений к базе данных без заметного снижения произоводительности. Вкратце охарактеризуем самые распространенные технологии доступа к данным:

Open DataBase Connectivity (ODBC): это API для доступа к реляционным базам данных. ODBC используется для подключения к БД, выполнения операторов SQL и получения результирующих наборов данных. ODBC позволяет приложениям «общаться» с различными системами управления базами данных (СУБД), используя один и тот же программный код.

Data Access Object (DAO): технология доступа к данным, разработанная для использования преимущественно с базами данных Jet, например, Microsoft Access или БД ISAM, такими как dBase, FoxPro и т.д.

Remote Data Objects (RDO): тонкая надстройка над ODBC, обеспечивающая соединение с БД, создание результирующих наборов данных, курсоров и выполнения хранимых процедур. Технология RDO была создана для работы с такими СУБД, как, например, SQL Server и Oracle.

OLE DB: сегодня приложения работают на различных платформах — настольных, мэйнфреймах или в интернете. Данные, с которыми приходится работать этим приложениям, могут находится в различных хранилищах данных — электронные таблицы, персональные базы данных и т.д. Такие технологии, как ODBC, DAO или RDO неспособны извлекать данные из любых источников. Для решения этой проблемы компания Microsoft разработала универсальную стратегию доступа к данным — Universal Data Access Strategy (UDA). Эта стратегия основана на COM. OLE DB — набор COM-интерфейсов, разработанных на основе концепций UDA, реализующих различные сервисы реальных хранилищ данных. Технология предназначена для доступа к реляционным и нереляционным источникам данных, включая мэйнфреймовые ISAM базы данных, системы электронной почты, текстовые файлы и т.д. — все зависит от местоположения данных.

Архитектура OLE DB состоит из потребителей данных (Data Consumers), провайдеров данных (Data Providers) и серверных компонент (Server Components). Потребитель — программный компонент, использующий интерфейс OLE DB. Среды разработки, такие как Power Builder, Delphi и языки программирования типа Visual Basic, Visual C++ — примеры потребителей.

Провайдер — программный компонент, реализующий интерфейс OLE DB. Провайдер может быть быть как провайдером данных (Data Provider) так и провайдером сервисов (Service Provider). Провайдер данных — программный компонент, представляющий свои данные в табличной форме, называемой набором строк ( rowsets ). СУБД, базы данных — примеры провайдеров данных. Этот тип провайдера является владельцем данных. Провайдер сервисов — компонент, который реализует сервисы («обработчики»), такие, например, как обработчик (процессор) запросов. Провайдеры сервисов не владеют данными.

ActiveX Data Objects (ADO): технология DAO оптимизирован для работы с базами данных Microsoft Access. RDO создано для доступа к СУБД типа SQL Server или Oracle с использованием ODBC. ActiveX Data Objects (ADO) — наследник технологий DAO и RDO. ADO объединяет все лучшее из DAO и RDO. ADO использует технологию OLE DB для доступа к данным из любого источника.

OLE DB — очень мощный интерфейс для доступа и манипуляции с данными, однако программирование напрямую через OLE DB очень сложно. Вот поэтому и появилось ADO. ADO реализует высокоуровневый, объектно-ориентированный интерфейс к OLE DB.

Объектная модель ADO основана на трех типах объектов — подключение ( Connection ), команда ( Command ) и набор данных ( Recordset ). Объект Connection хранит информацию о подключении к источнику данных, такую как имя, местоположение данных, имя пользователя и пароль, имя провайдера OLE DB и т.д. Объект типа Command используется для выполнения операторов SQL, хранимых процедур и т.д. Объект Recordset хранит результаты выполнения запросов. Далее приводятся типичные алгоритмы работы с этими тремя видами объектов:

Для подключения к источнику данных нужно:


    Объявить указатель на объект типа Connection

Создать объект Connection

p.CreateInstance ( __uuiof ( Connection ) ) ;

Открыть источник данных

p->Open ( data provider, data source name, user name, password ) ;

По окончании работы с данными закрыть соединение

Для создания объекта типа Command нужно:


    Объявить указатель на объект типа Command

Создать объект типа Command

p1.CreateInstance ( __uuidof ( Command ) ) ;

Сформулировать текст запроса

p1->CommandText = » …. Actual command …»

Указать тип команды

CommandType — свойство, которое может принимать предопределенные значения, такие как AdCmdTable , AdCmdStoredProc , AdCmdUnknown .

Для использования объекта типа Recordset нужно:

Объявить указатель на объект типа Recordset

Создаем объект Recordset

p2.CeateInstance ( __uuidof ( recordset ) ) ;

p2 -> CommandText = «… Actual command ….» ;

Выполнить запрос и получить результирующий набор данных

Закрыть Recordset
p2->Close( ) ;

Объект Recordset содержит реализацию методов, позволяющих пользователю обновлять данные в базе данных и перемещать указатель текущей записи по результирующему набору. Также этот объект содержит поля, хранящие число записей в наборе, тип курсора, тип блокировки и т.д.

В этой статье приводится детальное описание создания программы для манипуляций (добавления, изменения, удаления) со строками таблицы БД Microsoft Access через ADO. Таблица состоит из трех полей, названных Account, Name и Balance (код счета, имя владельца и сумма денег на счете).


Процесс создания компонент в ATL состоит из трех этапов:

Для создания модуля в Developer Studio существует мастер ATL COM AppWizard.

  • Выберите пункт меню File -> New.
  • В качестве проекта выберите ‘ATL COM AppWizard’. Введите имя проекта — ‘AdoServer’ и нажмите ‘OK’.
  • Выберите тип модуля ‘Dynamic Link Library’, нажмите ‘Finish’.

(b) Добавление компонента к модулю

Для добавления компонента воспользуемся мастером ‘ATL Object Wizard’. Для достижения цели придерживаемся следующих шагов:

  • Выберите пункт меню ‘Insert | New ATL Object’. На экране появится мастер ‘ATL Object Wizard’
  • Выберите категорию объекта — ‘Simple Object’ и нажмите ‘Next’.
  • На экране появится диалог ‘ATL Object Wizard Properties’.
  • В качестве краткого имени (Short Name) наберите ‘Customer’. Все остальные поля заполнятся автоматически. Нажмите OK.

(c) Добавление методов компонента

  • Компонент, созданный только что созданный нами, не содержит никакой функциональности. Для придания объекту функциональности определим пять методов, AddRecord( ) , UpdateRecord( ) , DeleteRecord( ) , Getrsetbyid( ) и Getrsetbysort( ) . Перед этим добавим две функции в заголовочный файл ‘Customer.h’:

HRESULT FinalConstruct( )
<
HRESULT hr ;
CoInitialize ( NULL ) ;
hr = m_pconnection.CreateInstance( __uuidof ( Connection ) ) ;
hr =m_pconnection->Open(_T(«Prov > Source=d:\\table1.mdb»),»»,»»,adOpenUnspecified ) ;
return S_OK ;
>

HRESULT FinalRelease( )
<
CoUninitialize( ) ;
HRESULT hr = m_pconnection->Close( ) ;
>

Функция FinalConstruct( ) вызывается перед созданием объекта проектируемого нами компонента. В этой функции происходит инициализация библиотеки COM, создается объект типа Connection и открывается источник данных. В функции FinalRelease( ) мы делаем обратное: библиотека COM деинициализируется и закрывается соединение с источником данных. Для работы этих двух функций в класс CCustomer, в раздел private необходимо добавить переменную m_pconnection типа _ConnectionPtr .

  • Переключитесь на закладку определения класса (Class View tab). Выберите интерфейс ICustomer и нажмите правую кнопку мыши. Из появившегося меню выберите ‘Add Method’.
  • В появившемся диалоге ‘Add Method to Interface’ укажите имя метода ‘AddRecord’ и заполните поле ввода параметров следующей строкой:

[in] int id, [in] BSTR name, [in] int balance

  • Нажмите ‘OK’.
  • Подобным образом добавьте остальные методы в файл IDL.

HRESULT DeleteRecord ( [in] int id ) ;
HRESULT UpdateRecord ( [in] int id, [in] BSTR name, [in] int balance ) ;
HRESULT Getrsetbyid ( [in] int accno, [out,retval] IDispatch ** p ) ;
HRESULT Getrsetbysort ( [in] int no, [out,retval] IDispatch ** p );

  • Добавление метода AddRecord( ) генерирует описание следующей функции в файле ‘Customer.cpp’:

STDMETHODIMP CCustomer::AddRecord ( int id, BSTR name, int balance)
<
// TODO: Add your implementation code here
return S_OK ;
>

  • Добавьте следующий фрагмент кода в метод AddRecord( ) :

_RecordsetPtr recset ;
HRESULT hr ;
CString query ;
query.Format ( «SELECT * FROM bank WHERE id IS NULL» ) ;
CComVariant vNull ;
vNull.vt = VT_ERROR ;
vNull.scode = DISP_E_PARAMNOTFOUND ;
hr = recset.CreateInstance ( __uuidof ( Recordset ) ) ;
if ( SUCCEEDED ( hr ) )
<
recset -> PutRefActiveConnection ( m_pconnection ) ;
hr = recset -> Open ( query.operator LPCTSTR( ), vNull,
adOpenForwardOnly, adLockOptimistic, adCmdText );
if ( SUCCEEDED ( hr ) )
<
COleSafeArray fieldlist ;
fieldlist.CreateOneDim ( VT_VARIANT, 3 ) ;
long arrayindex[3] = < 0, 1, 2 >;
CComVariant f1 ( «id» ) ;
CComVariant f2 ( «Name» ) ;
CComVariant f3 ( «Balance» ) ;
fieldlist.PutElement ( &arrayindex[0], &f1 ) ;
fieldlist.PutElement ( &arrayindex[1], &f2 ) ;
fieldlist.PutElement ( &arrayindex[2], &f3 ) ;
COleSafeArray valuelist ;
valuelist.CreateOneDim ( VT_VARIANT, 3 ) ;
CComVariant v1 ( id ) ;
CComVariant v2 ( name ) ;
CComVariant v3 ( balance ) ;
valuelist.PutElement ( &arrayindex[0], &v1 ) ;
valuelist.PutElement ( &arrayindex[1], &v2 ) ;
valuelist.PutElement ( &arrayindex[2], &v3 ) ;
recset -> AddNew ( fieldlist, valuelist ) ;
recset -> Close( ) ;
>
>

Здесь мы создаем объект Recordset , подключаем его к уже созданному объекту Connection (это делается вызовом функции _RecordSet::PutRefActiveConnection( ) ) и добавляем запись вызовом функции AddNew( ) . Список полей и список значений этих полей, передаваемые в метод AddNew( ) , описаны как массивы значений типа CComVariant.

  • Метод DeleteRecord( ) реализуется следующим образом

STDMETHODIMP CCustomer::DeleteRecord ( int id )
<
AFX_MANAGE_STATE ( AfxGetStaticModuleState( ) )
_RecordsetPtr recset ;
HRESULT hr ;
CString query ;

query.Format ( «SELECT * FROM bank WHERE > CComVariant vNull ;
vNull.vt = VT_ERROR ;
vNull.scode = DISP_E_PARAMNOTFOUND ;
hr = recset.CreateInstance ( _uuidof ( Recordset ) ) ;
if ( SUCCEEDED ( hr ) )
<
recset->PutRefActiveConnection ( m_pconnection ) ;
hr = recset -> Open ( query.operator LPCTSTR( ), vNull,
adOpenForwardOnly, adLockOptimistic, adCmdText );
if ( !recset -> GetadoEOF( ) )
<
recset->Delete ( adAffectCurrent ) ;
recset->Close( ) ;
>
>
return S_OK ;
>

Функция аналогична AddRecord ( ) , за исключением строки запроса и того, что вместо метода AddNew( ) мы вызываем метод _RecordSet::Delete( ) .

  • Теперь добавим реализацию метода UpdateRecord( ) , содержащего следующий код:

STDMETHODIMP CCustomer::UpdateRecord ( int id, BSTR name, int balance )
<
AFX_MANAGE_STATE ( AfxGetStaticModuleState( ) )
_RecordsetPtr recset ;
HRESULT hr ;
CString query ;

query.Format ( «SELECT * FROM bank WHERE > CComVariant vNull ;
vNull.vt = VT_ERROR ;
vNull.scode = DISP_E_PARAMNOTFOUND ;
hr = recset.CreateInstance ( __uuidof ( Recordset ) ) ;
if ( SUCCEEDED ( hr ) )
<
recset -> PutRefActiveConnection ( m_pconnection ) ;
hr = recset -> Open ( query.operator LPCTSTR( ), vNull,
adOpenForwardOnly, adLockOptimistic, adCmdText );
if ( ! recset -> GetadoEOF( ) )
<
CComVariant f1 ( name ) ;
CComVariant f2 ( balance ) ;
recset -> PutCollect ( L»Name», &f1 ) ;
recset -> PutCollect ( L»Balance»,&f2 ) ;
recset -> Update ( vNull, vNull ) ;
recset -> Close( ) ;
>
>
return S_OK ;
>

  • Теперь нам нужен метод, который будет искать в таблице указанную запись. Вот как он может выглядеть:

STDMETHODIMP Ccustomer :: Getrsetbyid ( int accno,IDispatch **p )
<
AFX_MANAGE_STATE ( AfxGetStaticModuleState( ) )
_RecordsetPtr recset ;
CComVariant v ( 0L ) ;
CString query ;

query.Format ( «SELECT * FROM bank where > recset = m_pconnection -> Execute ( query.operator LPCTSTR( ), &v,
adOptionUnspecified ) ;
*p = ( IDispatch * ) recset ;
recset -> AddRef( ) ;
return S_OK ;
>

Так как мы не меняем извлеченную запись, запрос выполняется несколько по-другому, чем в предыдущих случаях. Мы просто получаем набор записей вызовом метода _Connection::Execute( ) . Заметим, что в данном случае необходимо вызвать метод AddRef( ) , т.к. мы знаем, что есть клиент, использующий полученный набор записей. Если бы мы этого не сделали, набор записей был бы уничтожен еще до его использования клиентским приложением. Итак, мы подошли к реализации последнего метода, позволяющего отсортировать набор записей, получаемый из источника данных. Вот исходный код этого метода:

STDMETHODIMP CCustomer::Getrsetbysort ( int no, IDispatch **p )
<
AFX_MANAGE_STATE ( AfxGetStaticModuleState( ) )
_RecordsetPtr recset ;
CString query ;
CComVariant v ( 0L ) ;

if ( no == 0 )
query.Format ( «SELECT * FROM bank order by id» ) ;
else
query.Format ( «SELECT * FROM bank order by Name» ) ;
recset = m_pconnection -> Execute (
query.operator LPCTSTR( ), &v, adOptionUnspecified ) ;
*p = ( Idispatch * ) recset ;
recset->AddRef( ) ;
return S_OK;
>

Эта функция подобна Getrsetbyid( ) , работа которой была была объяснена чуть выше. Здесь мы получаем различным образом отстортированный нобор записей в зависимости от переданного в функцию идентификатора.

  • В файл ‘stdafx.h’ необходимо добавить следующие операторы:

#include
#import «C:\Program Files\CommonFiles\System\ado\msado15.dll»
no_namespace rename ( «EOF», «adoEOF» )

Теперь полученный компонент можно откомпилировать. Посмотрим, как использовать компонент на клиентской стороне. В настоящий момент мы знаем, как строятся компоненты ADO, получающие записи из источника данных (т.е. «серверные» компоненты). Напишем реализацию клиента, использующего методы, которые мы только что описали.

Для того, чтобы написать COM-клиента с использованием MFC, нужно проделать следующее:

  • Создать исполняемое диалоговое приложение с помощью AppWizard.
  • Добавить элементы управления, например, как показано на рисунке 1.

В дополнение к набору элементов, показанных на рисунке 1 добавьте элемент просмотра списка (list view). Этот список будет заполняться, если пользователь нажмет кнопку ‘List’.


  • Используя ClassWizard добавьте три перменные m_id , m_name и m_bal типа integer, string и integer соответственно — они будут содержать значения полей ввода.
  • Аналогично создайте переменные m_list и m_rad типа CListCtrl и CButton для элемента списка и радиокнопки.
  • Добавьте переменные m_hide , m_commit и m_search , все типа CButton , для кнопок ‘Hide’, ‘Commit’ и ‘Search’ соответственно.
  • Также на закладке Class view создайте следующие переменные в заголовочный файл ‘AdoClientDlg.h’:

  • Импортируйте библиотеку типов (Type Library) сервера в клиентское приложение. Это делается занесением следующих строк в файл ‘StdAfx.h’.

# include
# include «atlbase.h»
# import «C:\Program Files\Common Files\System\ado\msado15.dll» no_namespace rename ( «EOF», «adoEOF» )
# import «..\AdoServer\AdoServer.tlb» using namespace ADOSERVERLib ;

  • Добавьте указатель на интерфейс cust типа ICustomer * в файл ‘CAdoClientDlg.h’.
  • В функцию инициализации диалога OnInitDialog( ) добавьте следующие код:

BOOL CAdoClientDlg::OnInitDialog( )
<
// AppWizard generated code
// TODO: Add extra initialization here
CoInitialize ( NULL ) ;
CLSID clsid ;
HRESULT hr ;
hr = CLSIDFromProgID( OLESTR («AdoServer.Customer» ), &clsid ) ;
hr = CoCreateInstance ( clsid, NULL, CLSCTX_ALL, __uuidof ( ICustomer ), (void **) &cust ) ;
acc = ( CEdit * ) GetDlgItem ( IDC_EDIT1 ) ;
name = ( CEdit * ) GetDlgItem ( IDC_EDIT2 ) ;
bal = ( CEdit* ) GetDlgItem ( IDC_EDIT3) ;

// insert columns in the list view control
m_list.InsertColumn ( 0,»ID»,LVCFMT_LEFT,100 ) ;
m_list.InsertColumn ( 1,»Name»,LVCFMT_LEFT,100 ) ;
m_list.InsertColumn ( 2,»Balance»,LVCFMT_LEFT,100 ) ;

  • Создайте обработчики для шести кнопок (Add, Delete, Update, Commit, List и Hide):

void CAdoClientDlg::OnAdd( )
<
acc -> EnableWindow ( TRUE ) ;
name -> EnableWindow ( TRUE ) ;
bal -> EnableWindow ( TRUE ) ;
m_commit.EnableWindow ( TRUE ) ;
m_oper = 1 ;
>

void CAdoClientDlg::OnDelete( )
<
acc -> EnableWindow ( TRUE ) ;
m_search.EnableWindow ( TRUE ) ;
m_oper = 3 ;
>

void CAdoClientDlg::OnUpdate( )
<
acc -> EnableWindow ( TRUE ) ;
m_search.EnableWindow ( TRUE ) ;
m_oper = 2 ;
>

void CAdoClientDlg::OnList( )
<
SetWindowPos ( &wndTop, 50, 50, 400, 390,
SWP_SHOWWINDOW ) ;
m_hide.ShowWindow ( SW_SHOW ) ;
m_list.DeleteAllItems( ) ;
UpdateData ( TRUE ) ;
CComVariant custaccno ;
CComVariant custname ;
CComVariant custbal ;
CString name,acc,bal ;
int i = 0 ;
_RecordsetPtr recset ;

recset = ( _RecordsetPtr ) cust -> Getrsetbysort ( m_rad1 ) ;
while ( !recset -> adoEOF )
<
custaccno = recset -> GetCollect ( L»id» ) ;
acc.Format ( «%d», custaccno.iVal ) ;
m_list.InsertItem ( i, acc, i ) ;
custname = recset -> GetCollect ( L»Name» ) ;
name = custname.bstrVal ;
m_list.SetItemText ( i, 1, name ) ;
custbal = recset -> GetCollect ( L»Balance» ) ;
bal.Format ( «%d», custbal.iVal ) ;
m_list.SetItemText ( i, 2, bal ) ;
recset -> MoveNext( ) ;
i++ ;
>
recset->Close( ) ;
>

void CAdoClientDlg::OnCommit( )
<
UpdateData ( TRUE ) ;
switch ( m_oper )
<
case 1:
cust -> AddRecord ( m_id, _bstr_t ( m_name ), m_bal ) ;
break ;
case 2:
cust -> UpdateRecord ( m_id, _bstr_t ( m_name ), m_bal ) ;
break ;
case 3:
cust -> DeleteRecord ( m_id ) ;
break ;
>
m_ > m_name = «» ;
m_bal = 0 ;
acc -> EnableWindow ( FALSE ) ;
name -> EnableWindow ( FALSE ) ;
bal -> EnableWindow ( FALSE ) ;
m_commit.EnableWindow ( FALSE ) ;
m_search.EnableWindow ( FALSE ) ;
UpdateData ( FALSE ) ;
>

void CAdoClientDlg::OnSearch( )
<
UpdateData(TRUE) ;
CComVariant custaccno ;
CComVariant custname ;
CComVariant custbal ;
_RecordsetPtr recset ;

recset = ( _RecordsetPtr ) cust -> Getrsetbyid ( m_id ) ;
if ( ! recset -> adoEOF )
<
custaccno = recset -> GetCollect ( L»id» ) ;
m_ > custname = recset -> GetCollect ( L»Name» ) ;
m_name = custname.bstrVal ;
custbal = recset -> GetCollect ( L»Balance» ) ;
m_bal = custbal.iVal ;
recset -> Close( ) ;
UpdateData ( FALSE ) ;
name -> EnableWindow ( TRUE ) ;
bal -> EnableWindow ( TRUE ) ;
m_commit.EnableWindow ( TRUE ) ;
>
else
MessageBox ( «Record not found» ) ;
>

  • Деинициализируйте библиотеку COM, вызвав CoUninitialize( ) в конце функции InitInstance( ) :

BOOL CAdoClientApp::InitInstance( )
<
// wizard generate code
CoUninitialize( ) ;
return FALSE;
>

На этом заканчивается написание клиентской части приложения. Теперь можно откомпилировать и запустить на выполнение клиента и проверить на практике, как происходит его взаимодействие с серверным компонентом ADO.

Изучение ASP.NET+ADO.NET+Silverlight

Совсем недавно я начал работу над одним проектом, подразумевающим создание веб-сервиса с удобным графическим интерфейсом. В то время я обладал лишь достаточно базисными знаниями языка C# и навыками в разработке Windows-приложений на .NET технологиях. Именно поэтому я решил тогда построить веб-приложения на технологиях ASP.NET, ADO.NET (сервис предполагает активное взаимодействие с БД) и Silverlight.
Прошло всего несколько недель, и сервис готов больше, чем на половину. Не могу сказать, что знаю о вышеуказанных технологиях всё, но вполне достаточно :) Собственно мой топик сейчас — это рассказ о том, как, на мой взгляд, следует учить эти технологии и что читать. Фактически я написал то, что мне очень не хватало в свое время — практически план действий. Я нисколько не претендую на звание профессионала в указанных отраслях, просто хотелось бы дать несколько советов новичкам и просто начинающим. Итак, начнем.

ASP.NET
На мой взгляд, имея знания C# и базовые умения в разработке .NET приложений, уже можно начать разработку простейших ASP.NET приложений, благо среда Visual Studio предлагает множество инструментов, разобраться с которыми не представляет особого труда. Хотя, конечно, для более сложных приложений необходимо прочитать учебники. В моем случае это был «Microsoft ASP.NET 2.0 c примерами на C# 2005 для профессионалов» авторов Мэтью Мак-Дональд и Марио Шпушта (абсолютно уверен в сущестсовании более новой версии учебника). На мой взгляд, там хорошо указаны базовые знания, а так же (в моем случае) вещи, связанные с авторизацией и аутентификацией. Для создания ASP.NET сайта мне тех знаний хватило с лихвой.

ADO.NET
Как ни странно, но в учебнике «Microsoft ASp.NET 2.0 c примерами на C# 2005 для профессионалов» так же хорошо была изложена и технология доступа к БД: сначала вопрос о соединении (SQL Connection, SQL Adapter, SQL Command), а затем о DataSet, что вполне логично в плане порядка изучения. Так же полезным был учебник Троелсена — «С# и платформа .Net», в котором порядок изучения изменен с точностью наоборот, но и технология рассмотрена немного глубже. В общем, оба учебника достаточно хороши, если требуется разработать стандартное подключение. Потребуется копнуть глубже (например подключение с использованием OleDB адаптера) — читайте Троэлсена.

Silverlight
Из-за того, что по дримспарку студенты могут бесплатно получить множество ПО от Майкрасофта, я скачал вторую версию Expression Studio и не стал углубляться в новшества третьей версии. С Сильверлайтом все было не так просто, как с предыдущими технологиями. Первой книжкой была майкросовтовская «Введение в Microsoft Silverlight 2» автора Лоуренс Морони (по-моему, книга доступна бесплатно, но и без этого ее легко можно скачать на торрентах). Там было достаточно хорошо описаны базовые аспекты технологии, работы в Expression Blend и Visual Studio, но главным минусом этой книги, на мой взгляд, является наличие множества ненужных для базового уровня знаний (например, интеграция с JavaScript, работа на PHP и Java) и отсутствие других полезных вещей (например, SOAP сервис).
Поэтому советую так же посмотреть все видео на techdays: страница с роликами о Silverlight. (Михаил Черномордников и Сергей Пугачев, если вы это читаете, спасибо вам за ваши доклады, очень помогли).
Кроме того, если вы собираетесь в своем Silverlight-приложении использовать серверные возможности (например, работа с БД или авторизация), вам необходимо создать SOAP или REST сервис, через который и производить взаимодействие с сервером (а Silverlight, как известно, исполняется на стороне клиента). Много информации (и главное практической) я почерпнул в докладе Виталия Дильмухаметова на techdays, чего и вам советую )

И последнее. Если у вас возникают вопросы, ответы на которые вы не можете найти ни в учебниках, ни погуглив, не стесняйтесь обращаться к разработчикам на форумы MSDN’a и ASP.net, а для плохознающих английский — на форум RSDN и сайт Сильверлайтер. Знаю по собственному опыту: отвечают очень быстро и даже на совсем уж нубовские вопросы :)

Спасибо за внимание, надеюсь, это вам пригодится. Если есть какие-нибудь вопросы, замечания или любые фидбэки, буду рад ответить или выслушать в комментариях.

Основы ADO.NET

Введение

ADO.NET – это набор классов (фреймворк) для работы с базами данных, а также XML файлами. Аббревиатура ADO расшифровывается как ActiveX Data Objects. Данная технология имеет методы и классы для извлечения и обработки данных.

Список .NET приложений, которые используют возможности ADO.NET для различных действий с БД:

ASP.NET Web Applications

Структуры подсоединения к БД

Можно определить два типа архитектуры подключения:

  1. Архитектура, подключенная к базе: подсоединена к БД на протяжении всего рабочего времени.
  2. Архитектура, не подсоединённая к БД: приложение, автоматически подключается/отключается в процессе работы. Приложения на такой архитектуре используют временные данные, хранящиеся на стороне клиента (DataSet).

ADO.NET и его библиотеки классов

На данной диаграмме видны различные типы приложений (Веб приложения, консольные приложения, приложения для Windows и так далее), использующие ADO.NET для подсоединения к БД (SQL Server, Oracle, OleDb, ODBC, XML-файлы и так далее).

Классы в ADO.NET

Также на предыдущем рисунке мы видим различные классы, а именно:

  1. Connection Class
  2. Command Class
  3. DataReader Class
  4. DataAdaptor Class
  5. DataSet.Class

1. Connection Class

Данные классы применяются в ADO.NET для подсоединения к БД.

2. Command Class

Данный класс обеспечивает хранение и выполнение SQL команд. Ниже приведены различные команды, выполняющиеся с помощью данного класса.

  • ExecuteReader: Возвращает данные к клиенту в виде строк.
  • ExecuteNonQuery: Выполняет команду, изменяющую данные в базе данных.
  • ExecuteScalar: Данный класс возвращает только одно значение.
  • ExecuteXMLReader: (Только для классов SqlClient) Получает данные из базы данных SQL Server 2000 с помощью XML-потока.

3. DataReader Class

DataReader используется для получения данных. Он используется в сочетании с Command Class для выполнения SQL-запроса.

5. DataSet Class

Класс DataSet – сердце ADO.NET, представляющее из себя набор объектов DataTable. Каждый такой объект содержит много объектов DataColumn и DataRow.

Подключение ADO.NET к базе данных


Для настройки подключения Вы должны быть знакомы со строками подключения (connection strings). ConnectionString – строка переменной (регистр не учитывается). Строки подключения нужны нам для параметра SQLConnection. Данные примеры содержат основные значения, а именно: provider, server, database, userid и password.

SQL Аутентификация

String constr= «server=.;database=institute;user > ;

String constr= «data source=.;initial catalog=institute;u > ;

Windows Аутентификация ( Windows Authentication)

String constr= «server=.;database=institute;trusted_connection=true»

String constr= «server=.;initial catalog=institute;integrated security=true»

Получение и отображение данных из базы данных

Получить и отобразить данные можно по такой схеме:

  1. Создайте объект SqlConnection, используя строку подключения.
  2. Откройте соединение.
  3. Создайте SQLCommand. Укажите тип SQLCommand.
  4. Выполните команду (используйте executereader).
  5. Получить результат (используйте SqlDataReader).
  6. Закройте соединение.
  7. Получите результат.

Ниже приведен код для подсоединения к SQL:

public partial class WebForml : System.Web.UI.Page

protected void Page_Load( object sender, EventArgs e)

SqlConnection con = new SqlConnection ( «data source=.; database=Sample; integrated security=SSPI» );

SqlCommand cmd = new SqlCommand ( «Select * from tblProduct» , con);

Сетевая библиотека для C#

Хотелось бы найти сетевую библиотеку для C# TCP/IP для создания многопоточных серверов. Хотелось, чтобы передача данных осуществлялась с помощью пакетов. Можно было бы принимать данные как синхронно, так и асинхронно и работать с каждым клиентом отдельно. Также хотелось бы чтобы пакеты сериализовались в BSON или JSON.

Пробовал реализовать что-то свое, но получилось криво и почему-то пакеты иногда теряются и сбивается весь цикл чтения и парсинга пакетов. Для Java есть подобные библиотеки, а вот для .NET найти не могу. Спасибо за помощь!

1 ответ 1

Библиотек таких я лично не знаю. Возможно, они и есть, но толку от них было бы немного. Такие вещи реализуются самостоятельно. Используйте потоковые сокеты.

Создаёте Socket, привязываете к локальной конечной точке (метод Bind), указываете количество входящих соединений (метод Listen, -1 для неограниченного количества), принимаете входящие соединения и обрабатываете каждое в отдельном потоке. Что касается данных пакета, я думаю сами найдёте способ представления данных в нужном формате. Пусть будет метод, который перед отправкой всё вам завернёт в BSON или JSON, сериализует и пустит в сокет (десериализует при приёме).

Значит чат я бы на вашем месте организовал так:

  1. Идентифицировал бы клиента и заносил бы его в словарь сопоставляя его id ссылку на объект сокета
  2. При отправке сообщения, определял бы кому оно предназначено, вытаскивал бы сокет нужного пользователя из словаря по id и отправлял бы ему это сообщение
  3. В качестве словаря посоветую использовать асинхронные вещи, иначе будут проблемы

Если речь шла бы о промышленных масштабах, то нужно продумать ещё и алгоритм распределения нагрузки (но это уже отдельная тема).

Использование библиотеки ADO (Microsoft ActiveX Data Object) (стр. 1 )

Из за большого объема этот материал размещен на нескольких страницах:
1 2

Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Использование библиотеки ADO (Microsoft ActiveX Data Object)

Понятие о библиотеке ADO

Библиотека ADO (Microsoft ActiveX Data Object) служит для доступа к базам данных различных типов и предоставляет объектный программный интерфейс к интерфейсу OLE DB, который предлагается компанией Microsoft как альтернатива интерфейсу ODBC. Объектная модель ADO реализована на базе технологии COM (Component Object Model).

В середине 1990-х годов, с развитием и распространением технологии COM (Component Object Model), компания Microsoft объявила о постепенном переходе от ODBC к использованию новой технологии OLE DB. Однако OLE DB, по мнению самой компании Microsoft, является интерфейсом системного уровня, этот интерфейс должен использоваться системными программистами. Технология OLE DB является тяжеловесной, сложной и очень чувствительной к ошибкам. Она требует от программиста слишком многого. Работать с OLE DB слишком сложно. Чтобы облегчить работу с OLE DB, был создан дополнительный прикладной уровень, который получил название ADO (ActiveX Data Objects). Работать с ADO существенно проще, чем с OLE DB. Технология ADO предназначена для прикладных программистов.

На самом деле ADO является частью более крупномасштабной технологии под названием Microsoft Data Access Components (MDAC). Термин MDAC является общим обозначением для всех разработанных компанией Microsoft технологий, связанных с БД. К этому набору относятся ADO, OLE DB, ODBC и RDS (Remote Data Services). Часто приходится слышать, что люди используют термины MDAC и ADO как синонимы, однако это неправильно. На самом деле ADO является лишь одной из частей MDAC. Когда мы говорим о версиях ADO, мы имеем в виду версии MDAC. К основным версиям MDAC относятся версии 1.5, 2.0, 2.1, 2.5 и 2.6. Компания Microsoft распространяет MDAC в виде отдельного продукта. Этот продукт может быть загружен с веб-узла Microsoft бесплатно. Мало того, фактически его можно бесплатно включать в состав ваших собственных продуктов (существуют определенные ограничения, однако большинство разработчиков Delphi без каких-либо проблем удовлетворяют всем этим требованиям). Кроме того, MDAC входит в комплект поставки большинства продуктов Microsoft, имеющих отношение к базам данных. Обновление может быть выполнено вами, вашими пользователями или одним из устанавливаемых в системе приложений Microsoft. Подобное обновление фактически невозможно предотвратить, так как MDAC устанавливается в составе такого широко распространенного приложения, как Internet Explorer. К этому следует добавить, что компания Microsoft поддерживает лишь самую последнюю версию MDAC, а также версию, предшествующую самой последней. Исходя из всего этого, можно прийти к выводу: ваше приложение должно работать с самым свежим выпуском MDAC или с предшествующей ему версией.

Как разработчик ADO, вы должны регулярно просматривать страницы веб-узла Microsoft, посвященные MDAC. Для этого следует обратиться по адресу www. /data. Здесь вы сможете бесплатно загрузить самую свежую версию MDAC. Также рекомендуется загрузить MDAC SDK (13 Мбайт), если у вас еще нет этого пакета. На самом деле MDAC SDK входит в состав Platform SDK, так что, если у вас есть Platform SDK, значит, вы уже обладаете MDAC SDK. Пусть пакет MDAC SDK станет вашей библией. Вы должны загрузить его и регулярно обращаться к нему для получения необходимых сведений и ответов на любые вопросы, связанные с ADO. Если вы нуждаетесь в информации, связанной с MDAC, прежде всего вы должны обратиться к MDAC SDK.

Библиотека ADO может быть использована в любых средах, которые в состоянии выступить в роли OLE-клиента, например, в MS Office (VBA), 1C:Предприятии, административных скриптах Windows (.vbs и. js) и т. д. Примеры кода в настоящей статье будут приводиться на языке VBScript для административных скриптов Windows. С помощью библиотеки ADO можно обратиться к огромному количеству типов баз данных, например, dBASE, Access, Excel, Oracle, Paradox, MS SQL Server, Sybase, текстовые файлы, FoxPro, Active Directory Service, Microsoft Jet, Interbase, Informix, PostgreSQL, MySQL и т. д., необходимо только наличие установленного соответствующего OLE-провайдера («драйвера» соответствующего типа базы данных, который устанавливается в систему как правило из дистрибутива этой же базы данных). Примеры кода в настоящей статье будут приводиться только для MS SQL Server, т. к. невозможно объять необъятное. Перечень свойств и методов ADO, приведённый в этой статье, не является исчерпывающим (в некоторых случаях и описание некоторых свойств и методов не является полным). Полное описание объектной модели библиотеки ADO вы можете получить в MSDN или в файле «ADO210.CHM», который входит в поставку MS Office. Однако материала данной статьи достаточно, чтобы начать работать с ADO.

Основными объектами библиотеки ADO являются объекты Connection, Command и Recordset.

Объект Connection

Объект Connection обеспечивает создание подключения к источнику данных и эквивалентен текущему сетевому соединению с сервером. Объект Connection предоставляет возможность настройки соединения перед его открытием, установки базы данных по умолчанию, установки и разрыва соединения с источником данных, задания настроек и выполнения команды с помощью метода Execute. Примечание: для выполнения команды можно использовать также метод Execute объекта Command, не прибегая к объекту Connection.

Объект Connection создаётся следующим образом:

Set objConn = CreateObject(«ADODB. Connection»)

После этого вы можете вызывать и использовать методы и свойства этого объекта для доступа к базам данных:

Содержит строку, определяющую версию библиотеки. Только чтение.

Определяет параметры подключения к источнику данных. Чтение и запись. Это строка, содержащая несколько параметров, разделённых точкой с запятой. Свойство ConnectionString автоматически получает значение, заданное в качестве одноимённого аргумента метода Open. Свойство ConnectionString доступно для записи только для закрытого соединения. Многочисленные примеры различных строк подключения для различных типов баз данных вы можете найти в Интернете или в документации к соответствующим программным продуктам.

Устанавливает или возвращает число секунд ожидания подключения к базе данных. Значение по умолчанию — 15. Используйте это свойство, если возникают проблемы из-за плотного сетевого трафика или загруженности сервера. Если время, указанное в ConnectionTimeout, истекает до открытия подключения, происходит ошибка, и ADO отменяет попытку подключения. Если Вы установите свойство в ноль, ADO будет ждать бесконечно, пока подключение не будет открыто. Удостоверьтесь, что используемый провайдер поддерживает свойство ConnectionTimeout. Свойство доступно для записи только для закрытого соединения.

Устанавливает или возвращает число секунд ожидания выполнения команды. Значение по умолчанию — 30. Чтение и запись. Используйте это свойство, если возникают проблемы из-за плотного сетевого трафика или загруженности сервера. Если время, указанное в CommandTimeout, истекает до завершения выполнения команды, происходит ошибка, и ADO отменяет команду. Если Вы установите свойство в ноль, ADO будет ждать бесконечно, пока команда не будет выполнена. Удостоверьтесь, что используемый провайдер поддерживает свойство CommandTimeout. Установка CommandTimeout объекта Connection никак не связана с установкой свойства CommandTimeout объекта Command.

Устанавливает или возвращает строковое значение, которое содержит имя используемого провайдера. По умолчанию — «MSDASQL». Провайдер может быть также установлен содержанием свойства ConnectionString или параметром метода Open. Определение провайдера в более чем одном месте может иметь непредсказуемые результаты.

Устанавливает или возвращает строковое значение, которое содержит заданную по умолчанию базу данных. Если есть заданная по умолчанию база данных, запросы SQL могут использовать «дисквалифицированный» синтаксис для обращения к объектам в этой базе данных. Чтобы обращаться к объектам из другой базы данных, вы должны «квалифицировать» имена объектов именем этой базы данных. При подключении провайдер записывает заданную по умолчанию базу данных в это свойство. Некоторые провайдеры разрешают только одну такую базу данных на одно подключение, и в этом случае вы не сможете изменить это свойство. Некоторые источники данных и провайдеры могут не поддерживать это свойство, генерируя ошибку или возвращая пустую строку.

Определяет расположение курсора, т. е. место, где выполняется работа с данными. Возможные значения:

    adUseNone(1) — курсор не используется (только для совместимости со старыми версиями). adUseServer(2) — курсор на стороне провайдера (по умолчанию). adUseClient(3) — курсор на стороне пользователя. Может предоставлять дополнительные возможности, которые отсутствуют на стороне провайдера.

Изменение свойства CursorLocation не имеет никакого эффекта при уже существующем подключении. Связанные объекты Recordset и курсоры, возвращённые методом Execute, наследуют эту установку. При открытом объекте Recordset это свойство доступно только для чтения.

Определяет режим доступа для изменения данных в сеансе. Возможные значения:

    adModeUnknown(0) — режим доступа не установлен или не может быть определён (по умолчанию). adModeRead(1) — режим только для чтения. adModeWrite(2) — режим только для записи. adModeReadWrite(3) — режим для чтения и записи. adModeShareDenyRead(4) — не разрешает открывать соединение на чтение другим пользователям. adModeShareDenyWrite(8) — не разрешает открывать соединение на запись другим пользователям. adModeShareExclusive(12) — не разрешает открывать соединение другим пользователям. adModeShareDenyNone(16) — разрешает открывать соединение с любым видом доступа другим пользователям.

Вы можете установить это свойство только тогда, когда объект Connection закрыт.

Содержит коллекцию объектов Error. Любая инструкция, использующая объекты ADO, может сгенерировать одну или более ошибок провайдера. Когда происходит ошибка, в эту коллекцию могут быть помещены один или более объектов Error. Если следующая подобная инструкция также сгенерирует ошибку, коллекция будет очищена и заполнена заново. Каждый объект Error представляет определённую ошибку провайдера, но не ошибку ADO (ошибки ADO подвергаются механизму обработки исключительных ситуаций). Используйте метод Clear, чтобы вручную очистить коллекцию Errors. Некоторые свойства и методы возвращают предупреждения, которые появляются как объекты Error в коллекции Errors, при этом не останавливая выполнение программы. Перед тем, как вы вызываете методы Resync, UpdateBatch или CancelBatch объекта Recordset, метод Open объекта Connection, или устанавливаете свойство Filter объекта Recordset, вызовите метод Clear коллекции Errors. После этого вы можете прочитать свойство Count коллекции Errors, чтобы проверить возвращенные предупреждения.

Содержит состояние объекта. Только чтение. Свойство State может принимать следующие значения:

    adStateClosed(0) — объект закрыт. adStateOpen(1) — объект открыт. adStateConnecting(2) — объект соединяется. adStateExecuting(4) — объект выполняет команду. adStateFetching(8) — объект выполняет выборку строк.


Содержит коллекцию динамических свойств соединения (объектов Property). Подробнее — см. раздел «Динамические свойства объектов».

Open(ConnectionString, UserID, Password, Options)

Открывает сеанс подключения к источнику данных. Параметры:

    ConnectionString — необязательный. Строка, определяющая параметры подключения к источнику данных. Автоматически наследует значение свойства ConnectionString объекта Connection. Вы можете или установить свойство ConnectionString объекта Connection перед вызовом метода Open, или использовать параметр ConnectionString метода Open. UserID — необязательный. Имя пользователя, используемое при соединении. Password — необязательный. Пароль пользователя. Options — необязательный. Способ подключения к источнику данных. Возможные значения:

      adAsyncConnect(16) — открывает подключение асинхронно. Чтобы определить, когда подключение станет доступным, можно обрабатывать событие ConnectComplete. adConnectUnspecified(-1) — по умолчанию. Открывает подключение синхронно.

Если вы передаете информацию о пользователе и пароле как в строке ConnectionString, так и в параметрах UserID и Password, параметры UserID и Password имеют приоритет. Закончив ваши операции с открытым подключением, используйте метод Close() для освобождения всех связанных системных ресурсов.

Закрывает соединение с источником данных. Закрытие объекта не приводит к удалению его из памяти. Можно изменить свойства объекта, а затем открыть его снова. При закрытии подключения закрываются также все активные наборы записей (объекты Recordset) для данного подключения. Объекты Command, связанные с данным подключением, уже не будут связаны с данным объектом Connection. Закрытие объекта Connection во время транзакции генерирует ошибку и ADO автоматически откатывает транзакцию.

Execute(CommandText, RecordsAffected, Options)

Выполняет запрос, оператор SQL, хранимую процедуру или любую другую команду, доступную провайдеру. Возвращает объект Recordset, доступный только для чтения курсором Forward-only, если переданная команда возвращает записи. (Если нужен объект Recordset, доступный для записи, следует создать его непосредственно, и воспользоваться его свойствами и методами.) Параметры:

    CommandText — обязательный. Строка, содержащая оператор SQL, имя таблицы, хранимой процедуры или другую команду провайдера. RecordsAffected — необязательный. Целое число (long), определяющее число записей, затронутых командой. Заполняется провайдером. Options — необязательный. Целое число (long), определяющее тип команды. Возможные значения (значения можно суммировать):

      adCmdText(1) — текстовое определение команды или хранимой процедуры. adCmdTable(2) — создать SQL-запрос, который вернёт все строки указанной таблицы. adCmdStoredProc(4) — хранимая процедура. adCmdUnknown(8) — тип команды неизвестен (по умолчанию). adAsyncExecute(16) — асинхронное выполнение команды. adExecuteNoRecords(128) — не возвращать строки.

Отменяет выполнение последнего асинхронного вызова Execute() или Open(), если действие ещё не завершено.

ConnectComplete(pError, adStatus, pConnection)

Событие возникает после того, как осуществлено подключение к источнику данных. Параметры:

    pError — содержит объект Error, если произошли ошибки (свойство adStatus равно adStatusErrorsOccurred(2)) adStatus — определяет состояние соединения. Возможные значения (для всех событий):

      adStatusOK(1) — операция произведена успешно. adStatusErrorsOccurred(2) — операция потерпела неудачу. adStatusCantDeny(3) — операция не может быть отменена. adStatusCancel(4) — произошла отмена операции. adStatusUnwantedEvent(5) — предотвращает последующие уведомления до завершения выполнения метода события.

    pConnection — объект Connection, который вызвал событие.

Событие возникает после того, как прервано подключение к источнику данных. Параметры аналогичны параметрам события ConnectComplete.

InfoMessage(pError, adStatus, pConnection)

Событие возникает каждый раз, когда генерируется предупреждение (warning). Параметры аналогичны параметрам события ConnectComplete.

WillConnect(ConnectionString, UserID, Password, Options, adStatus, pConnection)

Событие возникает перед тем, как осуществлено подключение к источнику данных. Параметры в основном аналогичны параметрам события ConnectComplete. Options — целое число (long), которое указывает способ подключения — adAsyncConnect(16) или adConnectUnspecified(-1). В обработчике события можно изменять параметры подключения.

WillExecute(Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection)

Событие возникает перед выполнением команды. Параметры:

    Source — строка, содержащая оператор SQL или имя хранимой процедуры. CursorType — тип курсора для Recordset, который будет открыт. Тип курсора можно изменять. Возможные значения:

      adOpenUnspecified(-1) — тип курсора не определён. adOpenForwardOnly(0) — определяет forward-only курсор. То же, что и статический курсор, но вы можете прокручивать записи только вперед. Это оптимизирует выполнение, если вы должны сделать только один проход по Recordset’у. adOpenKeyset(1) — Определяет keyset-курсор. То же, что и динамический курсор, но вы не можете видеть записи, добавляемые другими пользователями, хотя записи, удаляемые другими пользователями, недоступны в вашем Recordset’е. Изменения данных другими пользователями видимы. adOpenDynamic(2) — Определяет динамический курсор. Добавления, изменения и удаления другими пользователями видимы; разрешены все типы движения через Recordset, исключая закладки, если провайдер их не поддерживает. adOpenStatic(3) — Определяет статический курсор. Статическая копия набора записей, которую вы можете использовать, чтобы найти данные или генерировать отчёты. Добавления, изменения или удаления другими пользователями не видимы.

    LockType — тип блокировки для Recordset, который будет открыт. Возможные значения:

      adLockUnspecified(-1) — тип блокировки не определён. adLockReadOnly(1) — только для чтения. Вы не можете изменить данные. adLockPessimistic(2) — пессимистическая блокировка. Провайдер гарантирует успешное редактирование записей. Запись блокируется сразу после начала редактирования и до момента сохранения записей. adLockOptimistic(3) — оптимистическая блокировка. Провайдер осуществляет блокировку записей только в момент сохранения изменений, т. е. когда вы вызываете метод Update(). adLockBatchOptimistic(4) — оптимистические пакетные модификации. Требуется для пакетного режима модификации (отложенное сохранение записей).

    Options — целое число (long), указывающее опции выполнения команды или открытия Recordset’а. adStatus — определяет состояние события. Возможные значения — см. описание аналогичного параметра события ConnectComplete. pCommand — объект Command, для которого применяется это событие. pRecordset — объект Recordset, для которого применяется это событие. pConnection — объект Connection, для которого применяется это событие.

Событие WillExecute может произойти из-за вызовов Connection. Execute, Command. Execute, или Recordset. Open. Параметр pConnection всегда содержит ссылку на объект Connection. Если событие происходит из-за вызова Connection. Execute, параметры pRecordset и pCommand будут установлены в Nothing. Если событие происходит из-за вызова Recordset. Open, параметр pRecordset будет содержать ссылку на объект Recordset, а параметр pCommand будет установлен в Nothing. Если событие происходит из-за вызова Command. Execute, параметр pCommand будет содержать ссылку на объект Command, а параметр pRecordset будет установлен в Nothing.

ExecuteComplete(RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection)

Событие происходит после завершения работы команды. Параметр RecordsAffected — целое число (long) — содержит количество записей, которые затрагивает команда. Остальные параметры аналогичны одноимённым параметрам описанных выше других событий. Событие ExecuteComplete может произойти вследствие вызовов Connection. Execute, Command. Execute, Recordset. Open, Recordset. Requery или Recordset. NextRecordset.

Вызов метода BeginTrans начинает новую транзакцию. Провайдеры, которые поддерживают вложенные транзакции, при вызове метода BeginTrans в пределах открытой транзакции начинают новую, вложенную транзакцию. Возвращаемое методом BeginTrans значение указывает уровень вложения: возвращаемое значение «1» указывает, что вы открыли транзакцию верхнего уровня (то есть транзакция не вложена в пределах другой транзакции), «2» указывает, что вы открыли транзакцию второго уровня (транзакция, вложенная в пределах транзакции верхнего уровня), и т. д.

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

BeginTransComplete(TransactionLevel, pError, adStatus, pConnection)

CommitTransComplete(pError, adStatus, pConnection)

RollbackTransComplete(pError, adStatus, pConnection)

Эти события вызываются после того, как заканчивает выполняться соответствующая операция (по работе с транзакциями) на объекте Connection.

OpenSchema(QueryType, Criteria, SchemaID)

Получает информацию схемы базы данных от провайдера. Возвращает объект Recordset. Recordset будет открыт как статический курсор только для чтения. Параметры:

    QueryType — число, тип запроса схемы. Подробнее — см. MSDN, описание перечисления «SchemaEnum». Criteria — необязательный. Массив ограничений запроса (фильтр). Подробнее — см. MSDN. SchemaID — GUID для запроса схемы провайдера, не определенной спецификацией. Этот параметр требуется, если QueryType установлен в adSchemaProviderSpecific(-1); иначе этот параметр не используется.

Объект Error содержит информацию об ошибках доступа к данным, которые принадлежат отдельной операции провайдера. Вы можете обратиться к свойствам объекта Error, чтобы получить информацию о каждой ошибке:

Содержит строку, определяющую короткое описание ошибки. Это свойство по умолчанию.

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

Идентифицирует имя объекта, который вызвал ошибку (строка).

Содержит строку из пяти символов, которая указывает код ошибки по стандарту SQL ANSI.

Содержит определённый провайдером код ошибки (целое число).

Подключаемся к базе данных и выполняем запрос с помощью объекта Connection:

Set objConn = CreateObject(«ADODB. Connection»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

U ‘логин пользователя SQL-сервера


PWD = «111» ‘пароль пользователя SQL-сервера

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

objConn. ConnectionString = ConnectString

objConn. ConnectionTimeOut = 15

Set objRecordset = objConn. Execute(«SELECT name, filename FROM sysdatabases»)

‘Перебираем результаты запроса

While Not objRecordset. EOF

For i=0 To objRecordset. Fields. Count-1

strRes = strRes & CStr(objRecordset. Fields(i).Value) & vbTab

WScript. Echo Trim(strRes)

Set objConn = Nothing

Set objRecordset = Nothing

Работаем с ошибками провайдера:

Set objConn = CreateObject(«ADODB. Connection»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

U ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

objConn. ConnectionString = ConnectString

‘Подключаемся к базе данных

‘Перебираем коллекцию ошибок

For Each E in objConn. Errors

WScript. Echo «Error. Description: » & E. Description

WScript. Echo «Error. Number: » & E. Number

WScript. Echo «Error. Source: » & E. Source

WScript. Echo «Error. SQLState: » & E. SQLState

WScript. Echo «Error. NativeError: » & E. NativeError

Set objConn = Nothing

Пример асинхронного подключения и обработки событий:

Set objConn = WScript. CreateObject(«ADODB. Connection», «Connection_»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

U ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

«;Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

WScript. Echo «Подключаемся к базе данных (асинхронно). «

objConn. Open. 16

WScript. Echo «objConn. State = » & objConn. State

WScript. Echo «Спим две секунды. «

WScript. Sleep 2000

WScript. Echo «Закончили спать.»

WScript. Echo «Закрываем соединение. «

WScript. Echo «Снова подключаемся к базе данных (асинхронно). «

objConn. Open. 16

WScript. Echo «objConn. State = » & objConn. State

WScript. Echo «Отменяем соединение. «

Set objConn = Nothing

Set objRecordset = Nothing

Function Connection_WillConnect(ConnectionString, UserID, _

Password, Options, adStatus, pConnection)

pConnection. ConnectionString = ConnectString

WScript. Echo «WillConnect event: pConnection. State = » & pConnection. State

Function Connection_ConnectComplete(pError, adStatus, pConnection)

WScript. Echo «ConnectComplete event: pConnection. State = » & pConnection. State


Function Connection_Disconnect(adStatus, pConnection)

WScript. Echo «Disconnect event: pConnection. State = » & pConnection. State

Function Connection_InfoMessage(pError, adStatus, pConnection)

WScript. Echo «InfoMessage event: pError. Description = » & pError. Description

Пример асинхронного выполнения запроса и обработки событий:

Set objConn = WScript. CreateObject(«ADODB. Connection», «Connection_»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

U ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

objConn. ConnectionString = ConnectString

‘Подключаемся к базе данных

Set objRecordset = objConn. Execute(«SELECT name, filename FROM sysdatabases»,,16)

‘Ждём, пока выполнится запрос

While objConn. State <> 1

WScript. Sleep 500

Set objConn = Nothing

Set objRecordset = Nothing

Function Connection_ExecuteComplete(RecordsAffected, pError, adStatus, _

pCommand, pRecordset, pConnection)

‘Перебираем результаты запроса

While Not pRecordset. EOF

For i=0 To pRecordset. Fields. Count-1

strRes = strRes & CStr(pRecordset. Fields(i).Value) & vbTab

WScript. Echo Trim(strRes)

Function Connection_WillExecute(strSource, CursorType, LockType, Options, _

adStatus, pCommand, pRecordset, pConnection)

WScript. Echo «WillExecute event: CursorType = » & CursorType

WScript. Echo «WillExecute event: LockType = » & LockType

WScript. Echo «WillExecute event: Options = » & Options

Пример работы с транзакциями:

Set objConn = WScript. CreateObject(«ADODB. Connection», «Connection_»)

‘Определяем параметры подключения к базе данных

ServerName = «(local)» ‘имя или IP-адрес сервера

DSN = «master» ‘имя базы данных

U ‘логин пользователя SQL-сервера

PWD = «111» ‘пароль пользователя SQL-сервера

«Data Source=» & ServerName & _

«;Initial Catalog=» & DSN & _

objConn. ConnectionString = ConnectString

‘Подключаемся к базе данных

Set objRecordset = objConn. Execute(«CREATE TABLE newTable (newColumn INT PRIMARY KEY)»)

Set objConn = Nothing

Set objRecordset = Nothing

Function Connection_BeginTransComplete(TransactionLevel, pError, _

WScript. Echo «BeginTransComplete event: TransactionLevel = » & TransactionLevel

Asp выбор сетевой библиотеки клиента для ado

SQL Server 2005 — настройка серверных сетевых библиотек, Shared Memory, Named Pipes, TCP/IP, VIA, выбор портов, TCP 1433, UDP 1434, динамические порты

Первое действие, которое обычно необходимо выполнить после установки SQL Server 2005, чтобы обеспечить возможность подключения к нему клиентов, — настроить серверные сетевые библиотеки. В SQL Server 2000 вы могли выбрать необходимые сетевые библиотеки во время работы мастера установки. В SQL Server 2005 настроить сетевые библиотеки можно только после установки сервера (или использовать специальные параметры в ini -файле при выполнении автоматизированной установки). При этом изменений по сравнению с предыдущими версиями в этом компоненте SQL Server очень много, и вмешательство администратора потребуется часто.

Что такое серверная сетевая библиотека? Это специальный программный модуль, который принимает от клиентов запросы на установку соединения с SQL Server 2005. Под клиентами подразумеваются как привычные клиентские приложения, так и утилиты администрирования, другие серверы SQL Server и т. п. Клиенты могут быть как локальными (т. е. находиться на том же компьютере, что и SQL Server ), так и сетевыми (обращаться к SQL Server по сети).

Если обращение производится по сети, то на клиентском компьютере должна быть установлена клиентская сетевая библиотека, соответствующая установленной серверной. Установку клиентской сетевой библиотеки на клиентский компьютер можно произвести при помощи мастера установки SQL Server 2005 (в списке компонентов нужно выбрать Client Connectivity (Совместимость клиентов), а затем — нужную сетевую библиотеку). Однако чаще всего этим заниматься нет необходимости, поскольку клиентские приложения используют драйверы OLE DB , ODBC или BDE для подключения к SQL Server . Эти драйверы подключаются к серверной сетевой библиотеке TCP / IP .

В SQL Server 2005 предусмотрено четыре сетевые библиотеки.

q Shared Memory (в списке в SQL Computer Management выглядит как Sm ) — эта библиотека используется только для локальных подключений (т. е. подключений с того же компьютера, на котором установлен SQL Server 2005), как правило, утилитами администрирования. Это новая сетевая библиотека, которой не было в предыдущих версиях SQL Server . По умолчанию она включена во все редакции SQL Server 2005.

q Named Pipes ( Np ) — именованный канал в оперативной памяти, в который одни процесс передает информацию, а другой — считывает. Может использоваться как для локальных, так и для удаленных подключений. Чаще всего он используется для локального подключения утилит администрирования предыдущих версий SQL Server , например, SQL Server 2000. По умолчанию для всех редакций SQL Server 2005 эта библиотека отключена.

q TCP/IP ( Tcp ) — самая популярная сетевая библиотека, которая используется в подавляющем большинстве случаев и почти всеми клиентскими приложениями. Как ни удивительно, но в SQL Server 2005 она по умолчанию включена только в редакции Enterprise Edition . Для всех остальных редакций ее придется включать вручную после установки.

q VIA ( Via , Virtual Interface Adapter — адаптер виртуального интерфейса) — экзотическая сетевая библиотека, которая используется только со специальным сетевым оборудованием. Также по умолчанию отключена во всех редакциях SQL Server 2005.

Обратите внимание, что в SQL Server 2005 больше нет поддержки таких сетевых библиотек, как Multiprotocol , NWLink IPX / SPX , AppleTalk и Banyan VINES . Библиотека Multiprotocol , в которой реализованы специальные алгоритмы шифрования данных, широко используется на отечественных предприятиях, и отказ от ее поддержки может стать неприятным сюрпризом для тех, кто собирается использовать SQL Server 2005.


На всякий случай подчеркнем еще раз: если вы используете любую редакцию SQL Server 2005, отличную от Enterprise Edition, то для обеспечения работоспособности многих клиентских приложений вам придется после установки вручную включить сетевую библиотеку TCP/IP!

Как же физически настроить сетевые библиотеки? В SQL Server 2000 для этой цели использовалось специальное средство под названием Server Network Utility . В SQL Server 2005 его больше нет. Вместо этого необходимо использовать утилиту под названием SQL Server Configuration Manager . Ее можно запустить из меню Пуск | Программы | Microsoft SQL Server 2005 или из консоли Computer Management (контейнер Services and Applications (Службы и приложения)). Основное предназначение этой утилиты — управление службами SQL Server 2005, а также серверными и клиентскими сетевыми библиотеками. Работа с серверными сетевыми библиотеками производится из контейнера Server Network Configuration (Сетевая конфигурация сервера), а клиентскими — из контейнера Client Network Configuration (Сетевая конфигурация клиента). Вам необходимо выбрать нужную сетевую библиотеку (под контейнером Protocols for имя_экземпляра), в контекстном меню выбрать пункт Properties (Свойства) и установить нужные значения свойств (например, Yes (Да) для свойства Enabled (Включено)). Работа с SQL Server Configuration Manager будет рассматриваться в разд. 3.3.

И еще два момента, связанных с сетевыми библиотеками.

Во-первых, в протоколе TCP / IP используются порты — идентификаторы конечного процесса-получателя пакета. Очень часто администратору SQL Server необходимо предоставить администратору сети информацию о том, какие порты должны быть открыты на брандмауэре, или поменять используемый SQL Server порт (например, если этого требует политика безопасности вашей компании). По умолчанию SQL Server настроен так: экземпляр по умолчанию ( default instance ) занимает порт TCP 1433 для приема клиентских подключений, а именованные экземпляры работают с динамическими портами. Это значит, что выбирается любой порт TCP из свободных на компьютере. Клиентский компьютер обращается на порт 1433, и затем сетевая библиотека, занимающая этот порт, обнаружив, что клиент обращается к именованному экземпляру, перенаправляет его на нужный порт. Такое поведение не всегда удобно, поскольку требует открытия всех портов сервера на брандмауэре.

Поменять это поведение и настроить именованный экземпляр на использование определенного порта (или настроить экземпляр по умолчанию на другой порт) можно так:

q откройте SQL Server Configuration Manager;

q раскройте в нем контейнер Server Network Configuration | Protocols for имя _ экземпляра | Tcp ;

q в правой части экрана выберите нужный IP -адрес (они отображаются как IP 1, IP 2 и т. п.; или IPAll — настройки для всех IP -адресов) и из контекстного меню откройте его свойства, а дальше определите значение свойства TcpPort .

Чтобы настройки вступили в силу, вам придется перезапустить SQL Server 2005.

Если для экземпляра SQL Server 2005 по умолчанию указать в качестве используемого порта порт 0, то он будет вести себя как именованный экземпляр, выбирая номер порта случайным образом из числа свободных на компьютере.

SQL Server 2005 использует еще один порт: UDP 1434. Этот порт используется службой SQL Browser для обнаружения установленных серверов SQL Server в сети и формирования их списка. Если вам необходимо получать список работающих в сети серверов SQL Server , на брандмауэрах необходимо отрыть и этот порт.

И еще один важный момент. По умолчанию SQL Server 2005 обменивается с клиентами пакетами в формате TDS ( Tabular Data Stream — табличный поток данных), которые совершенно не защищены от перехвата. Если кто-то в вашей сети перехватит эти пакеты, он сможет прочитать и запрос пользователя, и данные, которые возвратит сервер. В предыдущих версиях SQL Server вы могли шифровать трафик сетевого взаимодействия с SQL Server двумя способами: средствами сетевой библиотеки MultiProtocol и при помощи SSL (т. е. используя сертификаты). В SQL Server 2005 остался только один способ — применение SSL , но функциональность этого способа значительно расширена. Подробнее про применение SSL для защиты сетевого трафика SQL Server 2005 будет рассказано в разд. 5.6.2.

Лекция 6. Работа с базами данных.

Для того, чтобы создавать интересные web-страницы, необходимо наполнить их динамичным, обновляемым содержанием. Особенно необходимо это в бизнес-приложениях – банковских, интернет-магазинах и аукционах. Важная часть работы, которую выполняет разработчик ASP.NET – это связывание своих страниц с источниками данных, отображение данных на странице, создание удобных средств взаимодействия в с ними.

Для хранения данных чаще всего используются СУБД(системы управления базами данных). Как уже говорилось, в ASP.NET 2.0 работа с данными происходит через ADO.NET 2.0– часть .NET, разработаная специально для доступа к базам данных или XML-файлам.

СУБД прошли долгий путь развития. В начале все данные хранили в простых(плоских) файлах. По мере увеличения объемов данных встал вопрос о том, как получить быстрый доступ к нужной информации. Для этого данные стали индексироваться. Другой вопрос – как избежать дублирования – когда одни и те же данные хранятся в разных местах. Чтобы ее решить, была разработана теория нормализации баз данных. Сегодня мощная промышленная СУБД немыслима без систем защиты информации, журналирования, транзакций и хранимых процедур.

Данные в СУБД хранятся в таблицах. Таблица состоит из полей и записей. Запись – единица хранения данных, строка таблицы. Например, в одной записи хранятся сведения об одном человеке. Поля – это столбцы таблицы для хранения конкретного вида информации. Базы данных называются реляционными, потому что таблицы в них связаны определенным образом.

Представления(View) создаются на основе одной или нескольких таблиц с помощью фильтрации, объединения, сортировки и группирования.

Для наглядности рассмотрим эти понятия на примере. В свое время я работала с базой данных кадров одного предприятия. Как создать такую базу? Прежде всего нам нужна таблица для хранения данных о сотрудниках.

и так далее. Таблица может иметь тысячи записей.

Отделу кадров нужна информация о перемещениях сотрудников. Для этого заведена отдельная таблица. Например, Петров получил должность старшего программиста. Прежде всего надо заметить, что названий должностей ограниченное количество. Чтобы избежать дублирования, лучше их хранить в отдельной таблице.

Числа в левой колонке – это ключи. Они нужны, чтобы связать таблицы друг с другом. В таблице «Сотрудники» теперь будет храниться не название должности, а его ключ в таблице должностей. Для таблицы «Сотрудники» он называется внешним ключом, а для таблицы «Должности» — первичным ключом. Ключ также необходимо ввести в таблице сотрудников. Перемещение сотрудника на другую должность будет храниться в таблице перемещений так.

Таблица «Должности» связана как с таблицей сотрудников, так и с таблицей перемещений по своему уникальному ключу. База данных может генерировать первичные ключи сама, автоматически добавляя значения к предыдущему значению ключа. Это называется автоинкрементированием. Для полной уверенности в уникальности данных в таблицах могут держать точное время создания записи(Timestamp) и GUI(глобальный уникальный идентификатор).

Этот процесс называется нормализацией. Чтобы для отчета восстановить информацию о перемещении, в запросе нужно связать данные из разных таблиц.

В результате этого запроса будет создано представление, которое покажет данные из взаимосвязанных таблиц в удобной для чтения форме:

Множество таблиц данных, связанных отношениями, составляют базу данных. На сервере СУБД может храниться множество баз данных.

Подробнее о теории баз данных можно прочитать в других курсах. Перейдем к конкретным примерам связывания с базами данных на веб-страницах.

У каждого пользователя Windows наверняка имеется программа Access. Это однопользовательская СУБД, в которой модель безопасности не так сильна. В одном файле Access хранятся как данные, так и интерфейс в виде форм и отчетов. Можно создавать модули на VBA (Visual Basic for Application). Профессиональные разработчики пользуются более мощными программами. По «серьезности» СУБД от Microsoft идут в порядке – Access – FoxPro – MS SQL. MS SQL не позволяет создавать формы, а занимается хранением и защитой данных на профессиональном уровне. Visual Studio 2005 (и VWD) при инсталляции устанавливает MS SQL Express. Он будет запускаться автоматически в виде сервиса Windows.

Для работы с базами данных используется язык структурированных запросов – SQL (Structured Query Language). Команды этого языка называются запросами. Запросы служат для получения данных, для создания и изменения структуры таблиц, добавления, удаления и обновления записей и многого другого. Последовательность команд может храниться прямо на сервере СУБД в виде хранимой процедуры. Нужно стараться всегда пользоваться хранимыми процедурами, а не писать команды самим. Главное их преимущество – скорость работы и инкапсуляция бизнес-логики. Хранятся они на сервере в уже откомпилированном виде, в то время как простой переданный набор команд SQL проходит через стадию компиляции.

Для обращения к базам данных из внешних программ существуют специальные механизмы. В Windows это ODBC — открытый интерфейс взаимодействия с базами данных. Он позволяет приложениям, работающим под Windows или другими ОС, общаться с различными серверами реляционных баз данных.

Для конфигурирования источников данных на вашем компьютере зайдите в Control Panel, Administrative Tools, Data Sources(ODBC).

Мы видим, что ODBC при наличии нужного драйвера позволяет связываться с различными базами данных – Access, FoxPro, Oracle, Microsoft SQL, MySQL, SAP, DB2. Если в файле Excel создать именованную таблицу, ODBC способен ее распознать и работать как с таблицей базы данных.

Веб-проект в Visual Studio 2005 содержит предопределенную папку App_Data. В ней могут храниться файлы с данными, которые используются в приложении. Это могут быть файлы .mdf(MS SQL), .mdb(Microsoft Access), .xml и другие.
ADO.NET 2.0

ADO.NET – это набор классов для работы с внешними данными. В новой версии .NET 2.0 он был расширен новыми свойствами и тожет получил номер 2.0.

Соединение в ADO.NET может происходить с помощью различных провайдеров. В настоящее время рекомендуется работать с помощью провайдера MS SQL или Oracle. Эти провайдер сами написаны на управляемом коде .NET. Еще один провайдер OleDb, позволяет получить доступ к другим источникам данных – Access, Excel, MySql, SAP. Провайдер OleDb написан на неуправляемом коде, но может работать вместе с .NET.

Классы ADO.NET объединены в несколько пространств имен.

System.Data – это ядро ADO.NET. Оно содержит классы, необходимые для связи посредством любых провайдеров данных. Эти классы представляют таблицы, строки, столбцы, DataSet(множество взаимосвязанных таблиц). Там определены интерфейсы (в смысле языка C#) соединений с базами данных, команд, адаптеров данных.

System.Data.Common – базовые классы для всех провайдеров данных – DbConnection, DbCommand, DbDataAdapter.

В System.Data.OleDb находятся классы, позволяющие работать с источниками данных OleDb, в том числе с MS SQL версии 6.0 и ниже. Там находятся такие классы, как OleDbConnection, OleDbDataAdapter и OleDbCommand.

System.Data.Odbc содержит классы, которые работают с источниками данных ODBC посредством провайдера .NET ODBC. Классы имеют аналогичные имена с префиксом Odbc.

System.Data.SqlClient. Здесь определен провайдер данных для СУБД SQL Server версии 7.0 и выше. Содержатся классы SqlConnection, SqlTransaction, SqlCommand и другие.

В System.Data.SqlTypes находятся классы, представляющие типы данных СУБД SQL Server.

Классы ADO.NET делятся на 3 типа. Классы типа Disconnected определяют базовую структуру данных, например DataTable. Они независимы от каких-либо провайдеров данных и могут создаваться и заселяться данными непосредственно в программе. Классы Shared базовые и общие для всех провайдеров. Классы Data Provider специфические для разных провайдеров.
Программирование ADO.NET

Все провайдеры данных содержат классы соединений, адаптеров, команд. Схема типичной программы в ADO.NET такова.

1. Вначале создается соединение с базой данных – класс Connection, который обеспечивается необходимой информацией – строкой соединения.
2. Создается объект Command и задается команда, которую необходимо выполнить в данной СУБД. Эта команда может быть запросом SQL или исполняемой процедурой. Нужно задать параметры этой команды, если они имеются.
3. Если команда не возвращает данных, она просто выполняется с помощью одного из методов Execute. Например, это может быть удаление или обновление данных таблицы.
4. Если команда возвращает выборку данных, их необходимо куда-то поместить. Решите, нужно ли вам получить данные для последующего использования без связи с базой данных или же нужно просто быстро выполнить команду. В первом случае нужно создать класс DataAdapter и с его помощью сохранить данные в DataSet или в DataTable. Во втором случае создается класс DataReader, который требует сохранять соединение на все время работы, хранит выборку только для чтения и позволяет двигаться только вперед. Зато чтение с помощью DataReader выполняется в несколько раз быстрее, чем в DataAdapter.
5. Задать полученный DataSet или DataReader как источник данных элемента управления или вывести их на страницу другим способом.

Объект Connection для соединения с базой данных нуждается в строке соединения для указания пути к СУБД и входа в систему. Свойства класса Connection показаны в таблице. OleDbConnection, SqlConnection, OdbcConnection – наследники класса Connection, специфические для провайдеров OleDb, MS SQL ODBC соответственно.
Свойство Описание
DataSource Путь к базе данных в файловой системе при использовании Oledb, имя экземпляра базы сервера при использовании SqlConnection
Database Возвращает имя базы данных, используемой в объекте Connection после открытия
State Возвращает текущее состояние соединения. Возможные значения – Broken, Closed, Connecting, Executing, Fetching и Open.
ConnectionString Строка соединения с СУБД

Все свойства, кроме ConnectionString, только для чтения.
Использование объекта Command

Объект Command исполняет запрос SQL, который может быть в форме встроенного текста, процедуры сервера или прямого доступа к таблице. Если это запрос на выборку данных SELECT, то данные обычно помещаются в DataSet или в DataReader. Методы и свойства определены в абстрактном классе DbCommand(через интерфейс IDbCommand), и их реализуют частные ненаследуемые классы OleDbCommand, SqlCommand, OdbcCommand.

Свойство CommandType может принимать значения из перечисления CommandType. По умолчанию это Text, то есть выполняется непосредственно текст команды SQL, который записан в свойстве Command. TableDirect означает, что в результате выполнения команды будет возвращено все содержание таблицы. StoredProcedure означает, что в Command находится имя процедуры сервера, которая и будет выполняться.

Свойство CommandText хранит текст запроса SQL или имя серверной процедуры.

CommandTimeout задает время ожидания ответа, по умолчанию равное 30 секунд. Если команда не выполнится в течение этого времени, будет выброшено исключение.

Процедуры сервера нуждаются в параметрах. Они хранятся в коллекции Parameters и имеют тип SqlParameter. Текстовые команды также могут получать параметры, перед которыми ставится префикс @. Например:

Часто используется метод ExecuteNonQuery. С помощью него можно выполнить любую операцию с базами данных, которая не связана с запросом и получением данных, как то обновление, удаление записей, создание и изменение таблиц, создание процедур сервера. Она возвращает количество измененных записей в том случае, если выполняются команды Select, Update, Delete.

ExecuteScalar возвращает результат запроса в случае, если это одно-единственное значение. Например, нужно узнать количество заказов конкретного покупателя. Запрос выполняется с помощью команды “Select count * where customer >

ExecuteRow возвращает единственную запись.

ExecuteReader выполняется, если нужно получить табличные данные. Результат выполнения – курсор, в котором можно двигаться только от начала до конца.

В результате выполнения метода ExecuteReader объекта Command создается объект DataReader. Всегда закрывайте соединения после использования, иначе оно останется активным и будет занимать ресурсы. Это можно сделать двумя способами. Первый – вызвать перегруженный метод ExecuteReader, который принимает параметр типа CommandBehavior со значением CommandBehavior.CloseConnection. В таком случае необходимо перелистать полученную выборку от начала до конца, и соединение закроется, когда будет достигнут конец. Если вы не хотите прочитать все данные, можете самостоятельно закрыть соединение методом Close.

Развитые СУБД (теперь и MS Access) поддерживают транзакции. Транзакция – это последовательность команд, которая выполняется как одно целое. Например, при переводе денег сумма вычитается с одного счета и добавляется к другому. Если произойдет только одна из этих операций, банк или его клиенты понесут потери. поэтому важно, чтобы произошли обе операции или бы ни одна не произошла. Если на одном из этапов транзакции произошла ошибка, происходит откат(Rollback), то есть отменяются все ранее сделанные операции и база возвращается к состоянию до начала транзакции. Если все успешно, транзакция подтверждается операцией Commit.

Для поддержки транзакций введен класс SqlTransaction и ему подобные. У объекта Command есть свойство Transaction. Метод BeginTransaction объекта Connection заставляет базу данных перейти в режим транзакции.

Кроме того, необходимо всегда заключать программный код, работающий с базами данных, в блоки try/catch, так как работа часто происходит с удаленными серверами, и могут происходить самые разные ошибки как в сети. так и при работе самого сервера.

При этом выбрасывается исключение SqlException или OleDbException.

DbDataAdapter является родительским классом для SqlDataAdapter, OleDbDataAdapter, OdbcDataAdapter. Этот класс содержит 4 объекта типа Command. Классы DataAdapter обеспечивают двусторонний обмен информацией.

* SelectCommand – эта команда используется для выборки данных из базы. При этом класс DataTable заполняется данными.
* UpdateCommand – обновляет данные(редактирование записей).
* InsertCommand – добавление новых записей
* InsertCommand – команда для удаления записей

Метод Fill класса DbDataAdapter заполняет объекты DataSet или DataTable данными, прочитанными в результате выполнения команды SelectCommand. Эта команда должна быть запросом SQL типа Select. Если таблицы уже существуют, в него добавляются новые таблицы. Вообще метод Fill перегружен 8 раз. Например, DbDataAdapter.Fill Method (DataSet, String) добавляет в DataSet таблицу с именем, указанным во втором параметре. Если такая таблица уже есть, она обновляется. Доступ к таблице можно получить с помощью его имени индексатором.

Метод DbDataAdapter.Update записывает в базу данных все изменения, которые произошли в связанном с ним объекте DataSet.
DataSet

DataSet – это класс, содержащий в себе одну или несколько таблиц DataTable и связи между ними. Класс DataSet – это представление в памяти информации, считанной через ADO из баз данных или XML. Он позволяет манипулировать данными после отключения от источника данных.

Коллекция таблиц хранится в свойстве Tables, а отношений – в свойстве Relations.

Основываясь на таблицах датасета, можно создавать представления – DataView.

Напишем страницу, в которой будут использоваться представленные классы.

База Northwind входит в комплект SDK. Ее можно установить на сервере, запустив командную строку SQLExpress.

Окно внешних источников данных.

В Visual Studio 2005 существует 3 вкладки просмотра проектов: Solution Explorer, Class Explorer, Server Explorer. Первыми двумя активно пользовались все, кто писал программы на C#(или другом языке), а третий по умолчанию не виден, откройте его из меню View->Server Explorer. Это окно позволяет работать с соединениями баз данных, просматривать статистику работы сервера (В VWD Express нет пункта Servers).

Соединение можно установить как с MS SQL, так и с файлом Access и любым источником ODBC, а также Oracle. Можно также создать новую базу данных MS SQL.

Когда соединение создано, вы через пользовательский интерфейс можете добавлять таблицы, просматривать их содержание, писать процедуры сервера и многое другое.

В лекции 3 мы создали страницы с голосованиями, но никак не обрабатывали результаты. Сейчас мы будем сохранять результаты голосования.

1. В начале надо создать базу данных. В окне Server Exlorer нажмите правой клавишей мыши на пункт Data Connections, в контекстном меню выберите Create New Sql Database.

.SQLExpress равносильно (local) SQLExpress и означает сервер на локальной машине. Можно подключиться к серверу и по сети. Мы создали базу данных Polls, которая находится на сервере. Можно создать базу данных в отдельном файле .mdf, тогда ее можно будет переносить на другой компьютер.

2. Создание таблицы. Это можно сделать и программно, и через окно Server Exlorer. Там уже появился узел созданной базы Polls.dbo. Раскройте его, правой клавишей мыши кликните на пункт Tables, в контекстном меню выберите Add New Table. Заполните следующие значения.
Column Name Data Type Allow Nulls
id int +
variant nvarchar(100)
voices int

Поле id создается как уникальный идентификатор варианта, и оно должно быть первичным ключом таблицы. Кликните мышью на первой строке и выберите пункт Set Primary Key. Поле voices(количество голосов) при создании должно быть равно 0. В Columns Properties найдите строчку Default Value or Binding и впишите значение 0.

Создание той же самой таблицы в программном режиме:

3. Заполнение таблицы вариантами. Кликните мышью на таблице и выберите пункт Show Table Data. Значения id не должны повторяться.

4. Создание серверной процедуры. При каждом голосовании значение поля voices одной из записей таблицы, соответствующей нужному пункту, должно возрастать. Это удобнее сделать с помощью процедуры, которая принимает аргумент id и обновляет нужное поле. Кликните мышью на узел Stored Procedures и выберите пункт Add New Stored Procedure.

В этой процедуре заключены 2 взаимосвязанных команды, связанных общей логикой, а для выполнения ее понадобится только один объект Command. Также заметьте, что для ее вызова не нужно знать внутреннее устройство таблицы. Перед переменными процедуры и параметрами ставится @, чтобы отличить их от полей таблицы.

Оператор SELECT извлекает записи из таблицы poll, которые соответствуют условию после ключевого слова WHERE. Так как id – ключевое(уникальное) поле и выбирается одно поле voices, возвращается одно значение, которое можно записать в переменную. Затем в операторе UPDATE изменяется на увеличенное значение переменной @Count.

5. Привязка к данным. На новой странице создайте элементы Button и RadioButtonList(можно и CheckBoxList) перетаскиванием из Toolbox. На RadioButtonList имеется стрелка, открывающая Smart Tag. С помощью него можно сконфигурировать соединение с нужной таблицей или внести значения вручную. При нажатии на Configure Data Source появится мастер соединений. Выберите New Data Source. На втором шаге мастер предложит выбрать тип источника. Выберите Database. На следующем шаге из выпадающего списка выберите .sqlexpress.Polls.dbo. На четвертом шаге мастер предложит сохранить строку соединения в конфигурационном файле. Сохраним, она может понадобиться. Для заполнения переключателей необходимы 2 поля – в variant содержится текст варианта, который будет виден в форме, а id – номер варианта, который связан с DataValueField списка переключателей, и будет передаваться в процедуру сервера как параметр.

При желании на этом шаге можно отсортировать значения, например, по алфавитному порядку текстов нажатием на кнопку ORDER BY. На предпоследнем шаге можно протестировать полученный запрос, если все в порядке, то на последнем шаге ставим variant как источник для показа и id для значений. На странице должно получиться примерно следующее:

6. Обработка результатов. Процедуру необходимо вызвать с параметром, взятым из свойства Value группы переключателей. Свойство Parameters SqlCommand является коллекцией, в данном случае в нее надо добавить один элемент.

При работе с базами данных важно соблюдать принцип: «занимай ресурсы как можно позже и освобождай как можно раньше». Поэтому соединение закрывается сразу после выполнения процедуры сервера.
Заключение

Илон Маск рекомендует:  Работа со стандартными ресурсами
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL