Ado data control в действии


электронные книги

Иллюстрированный самоучитель по Visual Basic 6.0

Использование элемента ADO Data Control в форме

Рассмотрим использование элемента ADO Data Control в форме. Для этого выполните следующие действия:

1. Откройте новый проект.

2. Разместите в форме проекта элемент управления ADO Data control. Для этого дважды щелкните кнопку Adodc ¦Я на панели элементов управления.

3. Настройте соединение с источником данных для элемента управления ADO Data Control, как это было описано выше.

4. После настройки соединения с источником данных перейдите к настройке источника записей. Для этого вызовите диалоговое окно Property Pages для элемента ADO Data control. Перейдите на вкладку RecordSource и в раскрывающемся списке Command Type выберите значение adCmdTable. Из списка Table or Stored Procedure Name (Наименование таблицы или хранимой процедуры) выберите таблицу Customer с информацией о клиентах.

5. После настройки элемента ADO Data Control можно приступить к размещению в форме элементов управления для отображения данных из таб лицы. Для удобства рекомендуется располагать элементы таким образом, чтобы пользователю было удобно работать с формой. На рис. 17.10 показано размещение элементов для просмотра информации о покупателях.

Рис. 17.10. Форма с размещенными элементами управления для просмотра информации о покупателях

Рис. 17.11. форма для просмотра покупателей в режиме выполнения

6. Далее необходимо связать элементы отображения данных с элементом ADO Data control. Для каждого элемента управления выполните следующие действия:

  • выберите элемент, который необходимо связать с источником записей;
  • в окне Properties выбранного элемента из раскрывающегося списка свойства DataSource (Источник данных) выберите элемент ADO Data control, который был размещен на форме;
  • после того как элемент связан с источником записей, необходимо связать его с полем таблицы. Для этого используйте свойство DataField (Поле данных), из списка которого выберите требуемое поле таблицы.

7. После завершения настройки всех элементов формы, запустите проект на выполнение и просмотрите полученный результат (рис. 17.11).

Вопрос по Application role и ADO Data Control

27.09.2011, 17:49

Свойства ConnectionString и RecordSource в ADO Data Control
Прописал свойства Adodc во время проектирования — всё работает. Сделал то же самое во время работы.

ADO Data Grid Control
Помогите, пожалуйста, разобраться с ADO. Я создала SDI приложение. За базовый класс.

Нету ADO data controller и DataGrid Control
— Вообщем в методе написано добавить эти элементы на панель элементов, а у меня в вижле попросту их.

ADO Control + DB Grid?
Здравствуйте ! Хорошо если удается связать эти компоненты на этапе проектирования. Но у меня.

MS Data Grid Control
Подскажите пожалуйста один нюанс: Мне нужно чтобы в процессе перемещения по таблице DataGrid.

Ado data control в действии

Для работы с данными ваше приложение может использовать различные технологии. Это 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.

Введение в ADO.NET

Что такое ADO.NET?

Сегодня большое значение имеет работа с данными. Для хранения данных используются различные системы управления базами данных: MS SQL Server, Oracle, MySQL и так далее. И большинство крупных приложений так или иначе используют для хранения данных эти системы управления базами данных. Однако чтобы осуществлять связь между базой данных и приложением на C# необходим посредник. И именно таким посредником является технология ADO.NET.

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

Причем важно отметить, что систем управления баз данных может быть множество. В своей сущности они могут различаться. MS SQL Server, например, для создания запросов использует язык T-SQL, а MySQL и Oracle применяют язык PL-SQL. Разные системы баз данных могут иметь разные типы данных. Также могут различаться какие-то другие моменты. Однако функционал ADO.NET построен таким образом, чтобы предоставить разработчикам унифицированный интерфейс для работы с самыми различными СУБД.

Основу интерфейса взаимодействия с базами данных в ADO.NET представляет ограниченный круг объектов: Connection, Command, DataReader, DataSet и DataAdapter. С помощью объекта Connection происходит установка подключения к источнику данных. Объект Command позволяет выполнять операции с данными из БД. Объект DataReader считывает полученные в результате запроса данные. Объект DataSet предназначен для хранения данных из БД и позволяет работать с ними независимо от БД. И объект DataAdapter является посредником между DataSet и источником данных. Главным образом, через эти объекты и будет идти работа с базой данных.

Однако чтобы использовать один и тот же набор объектов для разных источников данных, необходим соответствующий провайдер данных . Собственно через провайдер данных в ADO.NET и осуществляется взаимодействие с базой данных. Причем для каждого источника данных в ADO.NET может быть свой провайдер, который собственно и определяет конкретную реализацию вышеуказанных классов.

По умолчанию в ADO.NET имеются следующие встроенные провайдеры:

Провайдер для MS SQL Server

Провайдер для OLE DB (Предоставляет доступ к некоторым старым версиям MS SQL Server, а также к БД Access, DB2, MySQL и Oracle)

Провайдер для ODBC (Провайдер для тех источников данных, для которых нет своих провайдеров)

Провайдер для Oracle

Провайдер EntityClient. Провайдер данных для технологии ORM Entity Framework

Провайдер для сервера SQL Server Compact 4.0

Кроме этих провайдеров, которые являются встроенными, существует также множество других, предназначенных для различных баз данных, например, для MySQL.

Основные пространства имен, которые используются в ADO.NET:

System.Data : определяет классы, интерфейсы, делегаты, которые реализуют архитектуру ADO.NET

System.Data.Common : содержит классы, общие для всех провайдеров ADO.NET

System.Data.Design : определяет классы, которые используются для создания своих собственных наборов данных

System.Data.Odbc : определяет функциональность провайдера данных для ODBC

System.Data.OleDb : определяет функциональность провайдера данных для OLE DB

System.Data.Sql : хранит классы, которые поддерживают специфичную для SQL Server функциональность

System.Data.OracleClient : определяет функциональность провайдера для баз данных Oracle

System.Data.SqlClient : определяет функциональность провайдера для баз данных MS SQL Server

System.Data.SqlServerCe : определяет функциональность провайдера для SQL Server Compact 4.0

System.Data.SqlTypes : содержит классы для типов данных MS SQL Servera

Microsoft.SqlServer.Server : хранит компоненты для взаимодействия SQL Server и среды CLR

Схематично архитектуру ADO.NET можно представить следующим образом:

Функционально классы ADO.NET можно разбить на два уровня: подключенный и отключенный. Каждый провайдер данных .NET реализует свои версии объектов Connection, Command, DataReader, DataAdapter и ряда других, который составляют подключенный уровень. То есть с помощью них устанавливается подключение к БД и выполняется с ней взаимодействие. Как правило, реализации этих объектов для каждого конкретного провайдера в своем названии имеют префикс, который указывает на провайдер:

Другие классы, такие как DataSet, DataTable, DataRow, DataColumn и ряд других составляют отключенный уровень, так как после извлечения данных в DataSet мы можем работать с этими данными независимо от того, установлено ли подключение или нет. То есть после получения данных из БД приложение может быть отключено от источника данных.

5.5. Технология доступа к данным ADO

5. 5 Технология доступа к данным ADO

Технология доступа к данным ADO

Основные особенности технологии доступа к данным ADO

Технологии ODBC и OLE DB считаются хорошими интерфейсами передачи данных, но как программные интерфейсы имеют много ограничений, т.к. являются низкоуровневыми.

Для снятия этих ограничений была предложена технология ADO (Delphi 5).

Технология ADO представляет иерархическую модель объектов для доступа к различным OLE DB-провайдерам данных. Объектная модель ADO включает объекты, обеспечивающие соединение с провайдером данных, создание SQL-запросов к данным и т.д.

Модель объекта не содержит таблиц, среды. Здесь основными объектами являются:

объект Набор данных;

объект Соединение, создающий связь с провайдером данных;

объект Команда –выполнение процедуры.

Особенностью технологии ADO является возможность ее использования в Интернет-приложениях для доступа к различным источникам данных.

Технология ADO и интерфейсы OLE DB обеспечивают для приложений единый способ доступа к источникам данных различных типов (рис.1).

Рис. 1. Схема доступа к данным через ADO

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

Эта технология аналогична BDE по назначению и довольно близка по возможностям. Используемые компоненты для доступа к данным также довольно похожи на соответствующие компоненты BDE. Поэтому, не вдаваясь в подробности, рассмотрим только особенности компонентов ADO при работе с локальными базами данных. Главное отличие состоит в процедуре настройки связи с таблицей базы данных.

Все использующие ADO компоненты доступа к данным размещены на странице ADO палитры компонентов (рис.2).


Рис. 2. Компоненты ADO

TADOConnection аналогичен компоненту BDE TDatabase и используется для указания базы данных и работы транзакциями. С одним компонентом TADOConnection может быть связанно несколько компонентов TADOTable и TADOQuery.

TADOTable используется для доступа к хранилищам данных ADO и представляет полученную информацию в виде таблицы.

TADOQuery позволяет выполнять SQL-запросы при работе с данны­ми через ADO. Соединение с хранилищем данных осуществляется стандарт­ным методом. Текст запроса содержится в свойстве SQL.

TADOStoredProc позволяет обращаться к хранимым процедурам, содержащимся в базах данных. Имя хранимой процедуры определяется свойством ProcedureName.

TADODataSet предназначен для представления набора данных из хранилища ADO.

TADOCommand и TADODataSet являются наиболее общими компонентами для работы с ADO, но и наиболее сложными в работе. Оба компонента позволяют выполнять команды на языке провайдера данных (так в ADO называется драйвер базы данных).

Установление связи с объектом ADO

В ADO компонентах для доступа к БД используется, так называемая строка подключения ConnectionString: WideString. В строке подключения указываются параметры подключения к БД такие как местоположение и имя БД, провайдеры, пароли необходимые для подключения и т.д. Запомнить состав строки и ее синтаксис довольно сложно, поэтому для ее настройки используется специальный мастер.

Первый шаг задания свойства ConnectionString, это выбор способа определения подключения. База данных может быть указана двумя способами: через файл формата Microsoft Data Link (расширение UDL) либо прямым заданием параметров соединения (рис. 3).

Рис. 3. Выбор способа определения строки подключения

При прямом задании соединения значение свойства ConnectionString может быть задано напрямую в поле ввода окна диалога ConnectionString. Однако обычно проще использовать специальный мастер, вызываемый щелчком на кнопке с многоточием в конце поля ввода. При этом открывается окно диалога Data Link Properties, в котором выбираются тип базы данных, ее местоположение и параметры соединения (см. рисунок 4). Данное окно диалога содержит четыре вкладки:

на вкладке Provider (Поставщик данных) выбирается тип БД. Базы данных Microsoft Access доступны через драйверы Microsoft Jet OLE DB Provider и Microsoft OLE DB Provider for ODBC. Базы данных dBase, Paradox и FoxPro доступны только через ODBC;

Рис. 4. Диалоговое окно настройки параметров соединения: выбор провайдера

состав элементов управления вкладки Connection (Подключение) зависит от выбранного типа БД (рис. 5). Рассмотрим вариант выбора соединений Microsoft Jet 4.0 OLE DB Provider:

флажок Blank password подавляет отображение окна диалога для ввода идентификатора и пароля пользователя при установлении соединения, если поле пароля пустое;

флажок Allow saving password сохраняет пароль в строке параметров соединения. Если флажок не установлен, то введенный пароль будет использоваться только при выполнении тестового соединения;

кнопка Test Connection позволяет проверить правильность и полноту параметров;

переключатель Use data source name позволяет ввести предустановленный псевдоним ODBC, а в положении Use connection string вводится как псевдоним, так и тип ODBC драйвера и параметры соединения;

путь к базе данных задается в поле ввода Select or enter a database name для соединения Microsoft Jet OLE DB Provider или в поле ввода Use data Source name для соединения Microsoft OLE DB Provider for ODBC. Причем в первом случае при щелчке на кнопке с многоточием, расположенной справа от поля ввода, появится окно диалога открытия файла, с помощью которого выбирается необходимый файл базы данных. Во втором случае путь к базе данных приходится вводить вручную;

Рис. 5 – Окно диалога Data Link Properties (вкладка Подключение)

на вкладке Advanced (Дополнительно) (рис.6) расположены дополнительные параметры, с помощью которых устанавливаются уровень доступа к файлу базы данных, время ожидания сетевого соединения (то есть время, через которое связь будет считаться потерянной, если сервер не отвечает) и уровень защиты соединения;

Рис. 6 – Окно диалога Data Link Properties (вкладка Дополнительно)

на вкладке All (Все) (рис. 7) можно отредактировать все параметры с предыдущих страниц и параметры, зависящие от выбранного соединения, не помещенные на вкладку Connection. Редактирование осуществляется путем ввода значений параметров в текстовой форме. Описание этих параметров можно найти в следующих документах: MSDN Data Access Services, Microsoft Data Access Components (MDAC) SDK, Microsoft ActiveX Data Objects (ADO), Microsoft ADO Programmers Reference, Using Providers with ADO.

Рис. 7 – Окно диалога Data Link Properties (вкладка Все)

В остальном, работа с компонентом ADOTable и ADOQuery практически ничем не отличается от работы аналогичных компонентов использующих механизм доступа BDE.

Объекты данных Microsoft ActiveX (ADO) Microsoft ActiveX Data Objects (ADO)

ADO используется в программах на C++ для подключения к SQL Server. ADO is used in C++ programs to connect to SQL Server. Само собой она также работает для подключения к базе данных SQL Azure в облаке. Of course, it also works to connect to Azure SQL Database in the cloud.

Каждый раздел в этой статье описывает компонент ADO. Each section in this article describes a component of ADO.

ADO.NET отличается от ADO. ADO.NET is different than ADO. Описание ADO.NET и многих других драйверов подключения SQL, а также их языков см. в разделе Драйверы SQL Server. ADO.NET, and many other SQL connection drivers and their languages, are discussed starting at SQL Server Drivers.

ADO ADO

Объекты данных ActiveX (ADO) включения клиентские приложения для доступа и управления данными из различных источников через поставщик OLE DB. Microsoft ActiveX Data Objects (ADO) enable your client applications to access and manipulate data from a variety of sources through an OLE DB provider. Простота использования, высокой скорости, издержки нехватки памяти и места на диске с небольшой его основных преимущества: Its primary benefits are ease of use, high speed, low memory overhead, and a small disk footprint. ADO поддерживает основные функции для создания клиента и сервера и веб-приложений. ADO supports key features for building client/server and Web-based applications.

ADO MD ADO MD

Объекты данных Microsoft ActiveX (многомерные выражения) (многомерные Объекты ADO) обеспечивает простой доступ к многомерным данным из языков, например Microsoft Visual Basic и Microsoft Visual C++. Microsoft ActiveX Data Objects (Multidimensional) (ADO MD) provides easy access to multidimensional data from languages such as Microsoft Visual Basic, and Microsoft Visual C++. ADO MD расширяет Microsoft ActiveX Data объектов (ADO) для включения объектов, определенных для многомерных данных, таких как объекты CubeDef и набора ячеек. ADO MD extends Microsoft ActiveX Data Objects (ADO) to include objects specific to multidimensional data, such as the CubeDef and Cellset objects. С ADO MD Обзор многомерной схемой, запроса куба и получения результатов. With ADO MD you can browse multidimensional schema, query a cube, and retrieve the results.

Как и ADO ADO MD использует поставщика OLE DB для получения доступа к данным. Like ADO, ADO MD uses an underlying OLE DB provider to gain access to data. Для работы с ADO MD, поставщик должен быть поставщик многомерных данных (MDP), согласно спецификации OLE DB для OLAP. To work with ADO MD, the provider must be a multidimensional data provider (MDP) as defined by the OLE DB for OLAP specification. MDPs представление данных в многомерных представлений, в отличие от поставщиков табличных данных (за), представляющих данные в табличных представлениях. MDPs present data in multidimensional views as opposed to tabular data providers (TDPs) that present data in tabular views. См. в документации по поставщику OLE DB для OLAP, более подробные сведения о синтаксисе конкретных и поведений, поддерживаемых поставщиком. Refer to the documentation for your OLAP OLE DB provider for more detailed information about the specific syntax and behaviors supported by your provider.

СЛУЖБА УДАЛЕННЫХ РАБОЧИХ СТОЛОВ RDS

Служба Remote Data (RDS) — это функция ADO, с помощью которого можно перемещать данные с сервера клиентское приложение или веб-странице, работы с данными на стороне клиента и возвращать обновления на сервер в рамках одного цикла обработки. Remote Data Service (RDS) is a feature of ADO, with which you can move data from a server to a client application or Web page, manipulate the data on the client, and return updates to the server in a single round trip.

Начиная с Windows 8 и Windows Server 2012, серверные компоненты служб удаленных рабочих СТОЛОВ, больше не включаются в операционной системе Windows (см. в разделе Windows 8 и настольная книга по совместимости Windows Server 2012 для получения дополнительных сведений). Beginning with Windows 8 and Windows Server 2012, RDS server components are no longer included in the Windows operating system (see Windows 8 and Windows Server 2012 Compatibility Cookbook for more detail). Клиентские компоненты служб удаленных рабочих СТОЛОВ будет поддерживаться в будущих версиях Windows. RDS client components will be removed in a future version of Windows. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. Avoid using this feature in new development work, and plan to modify applications that currently use this feature. Приложения, использующие служб удаленных рабочих СТОЛОВ, следует перевести WCF-сервиса данных. Applications that use RDS should migrate to WCF Data Service.

ADOX ADOX

Объекты расширения данных Microsoft ActiveX для языка описания данных и безопасности (ADOX) — это расширение объектов ADO и модель программирования. Microsoft ActiveX Data Objects Extensions for Data Definition Language and Security (ADOX) is an extension to the ADO objects and programming model. ADOX содержит объекты для создания схем и изменения, а также безопасности. ADOX includes objects for schema creation and modification, as well as security. Поскольку это объектно ориентированный подход для операций со схемой, можно написать код, который будет работать для различных данных источников независимо от различий в их собственном вариантов синтаксиса. Because it is an object-based approach to schema manipulation, you can write code that will work against various data sources regardless of differences in their native syntaxes.

ADOX — это вспомогательная Библиотека базовых объектов ADO. ADOX is a companion library to the core ADO objects. Он предоставляет дополнительные объекты для создание, изменение и удаление объектов схемы, например таблицы и процедуры. It exposes additional objects for creating, modifying, and deleting schema objects, such as tables and procedures. Она также включает объекты безопасности для обслуживания пользователей и групп, а также для предоставления или отмены разрешения на объекты. It also includes security objects to maintain users and groups and to grant and revoke permissions on objects.

Документация Documentation

Общие сведения об использовании ADO, RDS, многомерные Объекты ADO и ADOX. An introduction to using ADO, RDS, ADO MD, and ADOX.

В этом разделе документации по объектам ADO разделы для каждого ADO, RDS, ADO MD и ADOX объекта, коллекции, свойство, динамического свойства, метод, событий и перечисления. This section of the ADO documentation contains topics for each ADO, RDS, ADO MD, and ADOX object, collection, property, dynamic property, method, event, and enumeration.

Поддержка Support

Бесплатно Справка по проблемам ADO, попробуйте учет группа новостей ADO. For free help with ADO issues, try posting to the ADO public newsgroup. Этой группе новостей отслеживается специалистами поддержки службы поддержки продуктов Майкрософт (PSS), которые охватывают ADO и другими опытными разработчиками ADO. This newsgroup is monitored by Microsoft Product Support Services (PSS) support professionals who cover ADO, and by other experienced ADO developers.

Дополнительные сведения о вариантах поддержки можно найти на веб-узле справки и поддержки. Further information about support options can be found on the Microsoft Help and Support Web site.


События элемента управления источника данных (Data Source Control) в ASP.NET 2.0

Written on 18 Января 2009 . Posted in ASP.NET

Это будет вашим преимуществом, если вы будете иметь понятие об элементах управления источниками данных и жизненном цикле события. Многие реальные случаи требуют возможность программного доступа и назначения параметров, используемых для выборки, вставки, обновления либо удаления, что может быть осуществлено в соответствующем событии, происходящем до действия. Более того, для того, чтобы достойно управлять исключениями уровня базы данных либо библиотеки объектов, вы должны использовать события, происходящие после действия. Так, во время отладки происходящие до действия события предоставляют возможность распознавать параметры, которые были использованы для запроса к данным. Читайте далее, чтобы узнать больше об этом!

Модель события элемента управления источником данных (Data Source Control)

Элементы управления SqlDataSource и ObjectDataSource предоставляют методы для выборки, вставки, обновления и удаления данных — Select(), Insert(), Update() и Delete(). Данные методы могут быть вызваны программным путем или, что является частым случаем, могут быть автоматически из элемента управления данными, который был привязан к элементу управления источником данных. Когда вызывается метод Select() элемента управления SqlDataSource он устанавливает соединение с конкретной базой данных, запускает указанный запрос SelectCommand, и возвращает результат в DataView либо DataReader (в зависимости от значения DataSourceMode property). Когда вызывается метод Select() для ObjectDataSource, настроенному объекту приписывается значение и вызывается указанный метод. Результат данного метода затем возвращается из метода Select().

Несмотря на внутренние различия в методе Select() для элементов управления SqlDataSource и ObjectDataSource, оба элемента управления обладают одной и той же моделью события. Для четырех методов — Select(), Insert(), Update() и Delete() — элементы управления SqlDataSource и ObjectDataSource вызывают события до и после действия. Одно событие предшествует действию, а другое следует за ним. События названы соответственно прошедшему и настоящему временам. Событие выборки вызывается до того как получены данные как только была выполнена нижележащая команда выборки (select) — вызывается событие выборки. Следующая диаграмма демонстрирует данную модель.

Данная диаграмма показывает модель метода Select() элемента ObjectDataSource. Такая же модель используется для методов Insert(), Update()и Delete() и для элемента управления SqlDataSource. Хотя принцип одинаков как для элемента SqlDataSource, так и для ObjectDataSource, реализация все же отличается.

Исследуем события элемента управления SqlDataSource, происходящие до выполнения действия

Обработчикам событий элемента управления SqlDataSource,происходящих до действий, кроме прочих битов информации передается ссылка на объект Command, используемый для выполнения действия базы данных. Объект Command содержит информацию о той команде, которую нужно выполнить (посредством свойства CommandText) и которая будет нестандартным SQL-выражением либо названием хранимой процедуры. Она также будет иметь набор Parameters , который хранит параметры, используемые в запросе.

Если вам необходимо манипулировать параметрами, используемыми в выражениях SELECT, INSERT, UPDATE и DELETE, SelectCommand следующим образом: то вы можете сделать это посредством соответствующего обработчика события, выполняемого до действия. К примеру, представьте, что элемент управления SqlDataSource настроен с

В наборе элемента SqlDataSource будет параметр. Источник параметра может быть указан декларативным способом при помощи жёстко закодированного значения, получения значения из элемента управления со страницы, значеия строки запроса и т.д. Независимо от этого, значения параметра может быть исследовано и изменено (при необходимости) в обработчике события Selecting. (Читайте статью о фильтрации базы данных при помощи параметров для получения более детальной информации об использовании параметров с элементами управления источником данных.)

Для элемента управления SqlDataSource вы можете осуществить доступ к значению параметра при помощи e.Command.Parameters(«parameterName») для того, чтобы программно настроить (либо изменить) параметр @Salary:

Приложение к данной статье предоставляет вспомогательный метод для отображения CommandText и всех параметров принадлежащих Command при получении либо изменении данных используя элемент управления SqlDataSource. Данный результат может оказаться очень полезным при отладке.

Исследуем события элемента управления ObjectDataSource, происходящие до выполнения действия
Как и SqlDataSource, события элемента управления ObjectDataSource, происходящие до выполнения действия, предоставляют возможность специализации параметров, передаваемых в настроенный метод объекта. Вместо того, чтобы получать объект Command в обработчике события, обработчикам событий элемента ObjectDataSource, выполняемых до действия, передается объект словаря, названный InputParameters и содержащий информацию о входящих параметрах и их значениях.

К примеру, представьте что наш бизнес-объект вызывал метод GetEmployeesByDepartmentID(departmentID), где входной параметр departmentID типа был использован для получения информации только о тех сотрудниках, которые служат в определенном отделе. Для того, чтобы программно назначить значение данного входного параметра в обработчике события выборки ( Selecting) элемента управления ObjectDataSource, используйте следующий код:

Исследуем события элементов управления ObjectDataSource и SqlDataSource, происходящие после выполнения действия
После того, как было завершено определенное действие, элементы управления SqlDataSource и ObjectDataSource вызывают свои соответствующие события (Selected, Inserted, Updated или Deleted). В обработчике события, следующего за действием, число кортежей, подверженных изменению, сообщается после того, как произойдет исключение. Обработчику события элемента ObjectDataSource, происходящего после действия, также передается значение, полученное от вызванного метода библиотеки объектов (если есть такой). Исключение может произойти в случае, если база данных пала, было использовано неправильное значение параметра, была нарушена ссылочная целостность, либо по какой-нибудь другой причине. Более того, если было обнаружено исключение, то свойство ExceptionHandled может быть установлено в значение True, чтобы известить о том, что исключение может быть обработано.

Вывод

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

Компоненты ADO

В Delphi 5.0 появились компоненты для работы с Microsoft® ActiveX® Data Objects (далее ADO). ADO это технология стандартного обращения к реляционным данным от Microsoft. Эта технология аналогична BDE по назначению и довольно близка по возможностям.

Следует отличать компоненты Delphi, являющиеся частью библиотеки визуальных компонентов Delphi (VCL), и интерфейсы и объекты ADO, которые в них инкапсулированы. В дальнейшем, когда упоминается компонент — это компонент Delphi, а когда объект или интерфейс — это объект или интерфейс ADO.

Для работы с ADO на вкладке компонентов ADO есть шесть компонентов: TADOConnection, TADOCommand, TADODataSet, TADOTable, TADOQuery, TADOStoredProc .

Рис. 0. Палитра компонент ADO

  • TADOConnection аналогичен компоненту BDE TDatabase и используется для указания базы данных и работы транзакциями.
  • TADOTable — таблица доступная через ADO.
  • TADOQuery — запрос к базе данных. Это может быть как запрос, в результате которого возвращаются данные и базы (например, SELECT), так и запрос, не возвращающий данных (например, INSERT).
  • TADOStoredProc — вызов хранимой процедуры. В отличие от BDE и InterBase хранимые процедуры в ADO могут возвращать набор данных, поэтому компонент данного типа является потомком от TDataSet, и может выступать источником данных в компонентах типа TDataSource * .
  • TADOCommand и TADODataSet являются наиболее общими компонентами для работы с ADO, но и наиболее сложными в работе. Оба компонента позволяют выполнять команды на языке провайдера данных (так в ADO называется драйвер базы данных).

Разница между ними в том, что команда, исполняемая через TADODataSet , должна возвращать набор данных и этот компонент позволяет работать с ними средствами Delphi (например, привязать компонент типа TDataSource ). А компонент TADOCommand позволяет исполнять команды не возвращающие набор данных, но не имеет штатных средств Delphi для последующего использования возвращенного набора данных.

Очевидно, что все компоненты должны связываться с базой данных. Делается это двумя способами либо через компонент TADOConnection либо прямым указанием базы данных в остальных компонентах. К TADOConnection остальные компоненты привязываются с помощью свойства Connection , к базе данных напрямую через свойство ConnectionString.

База данных может быть указана двумя способами через файл линка к данным (файл в формате Microsoft Data Link, расширение UDL), либо прямым заданием параметров соединения.

Значение свойства всех ConnectionString этих компонент могут быть введены напрямую в текстовой форме, но куда проще вызвать редактор свойства нажав на кнопку » … » в конце поля ввода. Окно этого свойства выглядит так:

При выборе » Use data link file » и нажатии на кнопку » Browse… » появляется стандартный диалог выбора файла. Этот файл можно создать в любом окне explorer-а (в этом окне открытия файла, в самом explorer, на desktop и т.д.) вызвав контекстное меню и выбрав пункт » New/Microsoft Data Link «. Потом вызовите локальное меню для созданного файла и выберите в нем пункт » Open «. После этого появится property sheet описанный чуть ниже. Эти же вкладки содержит и property sheet, вызываемый через пункт » Property » локального меню UDL файла, но в нем еще есть вкладки относящиеся к самому файлу.

Использование файлов Microsoft Data Link упрощает поддержку приложений, так как возможно использовать средства Windows для настройки приложения.

При выборе в редакторе свойства » Use connection string » и нажатии на кнопку » Build… » появляется такой же property sheet, как и при выборе » Open » для Microsoft Data Link файла.

В этом окне выбирается тип базы данных, местоположение базы и параметры соединения.

На первой странице выбирается тип базы данных или Provider , в терминах ADO.

Базы MS Access доступны как через » Microsoft Jet OLE DB Provider «, так и через » Microsoft OLE DB Provider for ODBC «.

Следующая страница зависит от выбранного типа базы, однако для всех типов есть кнопка «Test connection» позволяющая проверить правильность и полноту параметров.

Для » Microsoft Jet OLE DB Provider » она выглядит так:

Checkbox «Blank password» подавляет диалог ввода идентификатора и пароля пользователя при установлении соединения, если поле пароля пустое.

Checkbox «Allow saving password » сохраняет пароль в строке параметров соединения. Если он не отмечен, то введенный пароль будет использоваться только при выполнении тестового соединения.

Для » Microsoft OLE DB Provider for ODBC » эта страница выглядит так:

Радиокнопка » Use data source name » позволяет ввести предустановленный алиас ODBC, а через «Use connection string» вводится как алиасы так и тип ODBC драйвера и параметры соединения.

Параметры идентификации пользователя аналогичны выше описанным.

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

На странице » All » можно отредактировать все параметры с предыдущих страниц и параметры зависящие от провайдера, но не вошедшие на страницу » Connection «. Редактирование осуществляется в виде параметр — значение, причем в текстовой форме, никаких диалогов нет. Помощи то же нет, эти параметры описаны только в документации на провайдер. Ее можно найти в MSDN Data Access Services/Microsoft Data Access Components (MDAC) SDK/Microsoft ActiveX Data Objects (ADO)/Microsoft ADO Programmer’s Reference/Using Providers with ADO.

В компоненте TADOConnection есть свойства Provider, DefaultDatabase и Mode которые являются альтернативным методом задания частей строки параметров соединения — провайдера, базы данных (например, пути до базы MS Access) и режима совместного использования файлов базы данных. Эти значение этих свойств автоматически включаются в строку соединения, если были заданы до активизации компонента и автоматически выставляются после соединения.

* Прим. ред. Компоненты StoredProc (и BDE и IB) могут возвращать набор данных, являются потомками TDataSet и могут выступать источником данных в компонентах типа TdataSource.

  • cоздадим простейшее приложение, состоящее из одной таблицы.
  • cоздаем форму состоящую из трех компонент
  • TADOTable с палитры компонент ADO,
  • TDataSource с палитры компонент Data Access,
  • TDBGrid cпалитры компонент Data Controls.


  • cвязываем компоненты, устанавливая
  • свойство TDBGridDataSource на компонент TDataSource,
  • свойство DataSet компонента TDataSource на компонент TADOTable.

Теперь нам необходимо указать базу данных. Делается это в свойстве ConnectionString компонента TADOTable . При нажатии на кнопку » … » появится редактор параметров соединения. Отметим радокнопку » Use data link file «, нажмите на кнопку » Browse… » и выберите в появившемся окне после файл линка к базе данных » \Program Files\Common Files\System\ole db\Data Links\DBDEMOS.UDL «. Этот линк указывает на базу в формате MS Access, входящую в поставку Delphi.

После этого в свойстве TableName компонента TADOTable выберем таблицу customer.

Активизируем компонента TADOTable , установив свойство Active в True.

Приложение можно запускать. Этот пример можно найти в директории Simple.

ADO основано на технологии COM. Все объекты и интерфейсы ADO являются интерфейсами и объектами COM.

Рис 8. Архитектура ADO

Объекты этого типа выполняют следующие функции:

  • Связь с сервером.
  • Управление транзакциями.
  • Получение информации о произошедших ошибках (свойство Errors).
  • Получение информации о схеме данных (таблицы, поля и так далее).

Рис 9. Схема взаимодействия в ADO основных COM интерфейсов

Интерфейсы Recordset и Field

Интерфейс Recordset (на нижнем уровне ADO это IRowset ) является аналогом TDataSet в Delphi.

Поддерживает текущее положение и перемещение курсора, закладки (bookmarks), чтение, изменение и удаление записей и так далее. Значение полей и их типы доступны с помощью свойства Fields.

Интерфейс Field позволяет получать значение поля, его тип длину и так далее.

Интерфейсы Command и Parameter

Эти два типа позволяют работать с командами источника данных. Синтаксис команд для каждого из источников свой.

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

Библиотека довольно запутанная, многие функции дублированы в разных объектах. Например, Recordset можно создавать напрямую, методом Open , (причем предварительно создавать Connection не обязательно), можно получить как результат выполнения метода Command.Execute , либо после Connection.Execute задав команду без параметров.

Интерфейс Command инкапсулирован во все компоненты за исключением TADOConnection . Это сделано потому, что в ADO нет возможности получить данные не выполнив команду.

Интерфейс Recordset инкапсулирован в компоненты производные от TCustomADODataSet . Это компоненты TADODataSet, TADOTable, TADOQuery, TADOStoredProc .Получать данные из них возможно штатными средствами Delphi.

Возможно получение данных и при выполнении компонента TADOCommand . Метод этого компонента Execute возвращает тип _Recordset . После чего его можно, например, связать с компонентом TADODataSet следующим образом

Компоненты TADOTable, TADOQuery и TADOStoredProc являются частными случаями команды, соответственно для таблицы, SQL запроса и хранимой процедуры.

Тип Connection инкапсулируется в компонент TADOConnection .

Когда вы выполняете команду предварительно не открывая соединение, оно все равно создается. Получить к нему доступ возможно через свойство Recordset . Привязать компонент TADOConnection к уже открытому соединению возможно через свойство ConnectionObject .

Информацию о структуре базы данных можно получить с помощью метода OpenSchema компонента TADOConnection . Эта информация представлена как набор таблиц, как стандартизованных, так и специфических для провайдера. Таким способом можно узнать список таблиц, запросов, хранимых процедур и многое другое. Однако изменять структуру базы с помощью возвращаемых наборов данных невозможно.

Пример использования TADOConnection

В этом примере рассматривается работа с компонентом TADOConnection , SQL запросами с параметрами и трансакциями.

Создадим приложение из следующих компонентов

  • Connect типа TADOConnection
  • MasterSQL и DetailSQL типа TADODataSet
  • MasterDS и DetailDS типа TDataSource
  • MasterGrid и DetailGrid типа TDBGrid

Рис 10. Master-detail форма на этапе дизайна

Связываем MasterGrid, MasterDS,MasterSQL и DetailGrid,DetailDS,DetailSQL аналогично предыдущему примеру, за исключением того, что вместо типа TADOTable используется тип TADODataSet.

Привязываем Connect к базе данных. Для этого в редакторе свойства ConnectionString выбираем ту же базу данных, что и в предыдущем примере.

Для ввода SQL запросов необходимо отредактировать свойство CommandText компонентах MasterSQL и DetailSQL . После нажатия на кнопку » … » появится редактор компонент, который выглядит следующим образом

Кнопка » Add Table to SQL » добавляет в текст SQL запроса таблицу, выбранную в списке » Tables «, а » Add Field to SQL » поле таблицы, выбранное в списке » Fields «.

Запрос для MasterSQL

Запрос в DetailSQL должен выбирать только те детали, поставщик которых является текущим в MasterSQL . Для этого установим свойство DataSource компонента DetailSQL в значение MasterDS .

Запрос для DetailSQL следующий:

:VendorNo в части where — параметр запроса. Параметры при установленном DataSource берутся из него.

Активизируем MasterSQL и DetailSQL аналогично предыдущему примеру.

Приложение можно запускать. Этот пример можно найти в директории MasterDetail .

Пример использования параметров запроса

Теперь ограничим выборку поставщиков по значению поляState. Для этого добавим к форме следующие компоненты StateEdit типа TEdit c вкладки Standard , QueryButton типа TButton c вкладки Standard

Изменим запрос в MasterSQL на

:StateID — параметр, вместо которого при выполнении подставляется значение.


Добавим так же обработчик события OnClick в QueryButton следующего содержания

Программа готова. Этот пример можно найти в директории Param .

Синхронизация данных клиента и сервера.

В ADO используются три метода синхронизации данных на клиенте и сервере.

  • c помощью метода Resync, который повторно считывает записи набора. Этот метод используется при выполнении метода Refresh Delphi .
  • повторный запрос методом Requery , который заново выполняет запрос на сервере. Выполнение этого метода то же самое, что и выполнение подряд закрытия и открытия набора данных.
  • уведомление сервером клиента в случае изменения данных.

Этих методы доступны во всех компонентах имеющих набор данных. Однако эти функции доступны не для всех баз данных.

Работа с транзакциями

В компонентах ADO работа с транзакциями осуществляется через компонентTADOConnection .

Тип транзакции устанавливается в свойствеIsolationLevel одной из следующих констант:

Сервер будет использовать лучший, по его мнению, тип изоляции.

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

Чтение данных измененных в не подтвержденных транзакций. То есть изменения видны сразу после того как другая транзакция передала их на сервер.

То же самое что и IlReadUncommitted

Чтение данных измененных подтвержденными транзакциями. То есть изменение данных будет видимо после выполнения Commit в другой транзакции.

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

Транзакция не видит изменений данных произведенных другими транзакциями.

То же самое что и IlIsolated.

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

Свойство Attributes устанавливает открывать ли новую транзакцию автоматически

  • xaCommitRetaining — при подтверждении транзакции
  • xaAbortRetaining — при отмене транзакции

Так же у компонента TADOConnection есть три метода для работы с транзакциями:

  • BeginTrans Начинает транзакцию
  • CommitTrans Подтверждает сделанные изменения
  • RollbackTrans Откатывает транзакцию.

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

За базовый возьмем пример использования TADOConnection.

Добавим к форме две кнопки (StCmButton и RollbackButton ) типа TButton , обработчики событий OnClick этих кнопок, процедуру fix_controls без параметров к форме, обработчик события OnActivate формы

Программу можно запускать. Этот пример находится в директории Trans .

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

Доступ к данным

В отличие от BDE, ADO поддерживает больше настроек работы данных.

В ADO есть понятие набора данных ( recordset ) и тесно связанное с ним понятие курсора ( cursor ). Что такое курсор в документации на ADO не описано. Однако почему то месторасположение набора данных называется положением курсора. Я думаю, что это терминологическая путаница в Microsoft и курсор то же самое что набор данных.

Во всех компонентах имеющих набор данных (то есть в TADODataSet, TADOTable, TADOQuery, TADOStoredProc ) есть свойства CursorLocation, CursorType, LockType и MarshalOptions , устанавливающие параметры обмена с сервером. Все эти свойства должны быть установлены до того, как набор данных открывается. Если вы установите их позже, то эффекта не будет.

CursorLocation — определяет, где выполняется работа с набором на клиенте ( clUseClient ) или на сервере ( clUseServer ). Если набор данных расположен на клиенте, то с сервера данные запрашиваются однократно (или до выполнения повторного запроса), в дальнейшем вся выборка данных и позиционирование идет на клиенте. Однако модификация данных производится немедленно.

CursorType — устанавливает тип курсора. Значение одно из:

  • ctUnspecified — библиотека ADO сама определяет оптимальный тип блокировки.
  • ctStatic — статический курсор. Статическая копия набора записей, которую вы можете использовать, например, для генерации отчета. Добавления, изменения или удаление записей другими пользователями не видимы.
  • сtOpenForwardOnly — идентичен статическому курсору, за исключением того, что вы можете переходить только вперед. Это тип улучшает эффективность в ситуациях, когда вы делаете только один проход через набор данных.
  • ctDynamic — динамический курсор. Добавления, изменения и удаление другими пользователями видимы и возможны все типы передвижения по набору данных. Закладки (bookmarks) возможны только, если провайдер данных их поддерживает.
  • ctKeyset — курсор набора данных. Аналогичен динамическому курсору, за исключением того, что вы не увидите записи добавленные другими пользователями, а записи удаленные другими пользователями недоступны из вашего набора данных. Изменения данных другими пользователями видимы.

Надо заметить, что TDBGrid и другие компоненты, одновременно работающие с несколькими записями, могут работать только когда закладки поддерживаются. Поэтому для компонент с которыми вы будите связывать такие компоненты должны использоваться типы ctKeyset или ctDynamic .

LockType — определяет тип блокировки записей в наборе данных. Оно из:

  • ltUnspecified — библиотека ADO сама определяет какой тип будет использоваться.
  • ltReadOnly — только чтение, изменение данных невозможно.
  • ltPessimistic — пессимистическая блокировка. Запись блокируется сразу после начала редактирования и до сохранения записей.
  • ltOptimistic — оптимистическая блокировка. Запись блокируется только когда изменения сохраняются.
  • ltBatchOptimistic — тоже самое что и ltOptimistic , но используется отложенное сохранение изменений записей. Более подробно она рассматривается в следующем пункте.
  • MarshalOptions — это свойство определяет будут ли отправлены на сервер те поля, которые не были изменены. При значении moMarshalAll будут, а при moMarshalModifiedOnly не будут.

Работа с отложенными изменениями

Обратите внимание, что в компонентах ADO нет свойства CachedUpdates , но это не означает, что невозможно отложить передачу изменений данных на сервер. Эта возможность встроена с ADO и называется Batch Updates .

Для ее использования необходимо использовать клиентский курсор (то есть установить свойство CursorLocation в clUseClient ) и LockType в ltBatchOptimistic

Так же есть метод сохраняющий изменения UpdateBatch и метод их отменяющий CancelBatch .

К каким записям из набора данных применяется действие зависит от единственного параметра этих функций

arCurrent — текущая запись


arFiltered — записи, которые попали в фильтрацию.

arAll — все записи набора.

Пример работы с отложенными изменениями .

  • За основу возьмем пример работы с транзакциями.
  • Добавим компоненты
  • BatchCB типа TCheckBox
  • ApplyButton типа TButton
  • CancelButton типа TButton
  • Добавим обработчики событий OnClick во все эти три компонента.
  • Изменим обработчик события OnActivate формы.

События ADO предназначены для той же цели, что и события VCL. Многие из них имеют аналогичные события VCL и компоненты вызывают из событий ADO события VCL. В компонентах доступны как события ADO, так и события BDE.

  • OnWillConnect — вызывается перед установкой соединения.
  • OnConnectComplete — после установки соединения.
  • OnDisconnect — при разрыве соединения.

Эти события инкапсулированы в компоненте TADOConnection.

  • OnBeginTransComplete — при выполнении BeginTrans .
  • OnCommitTransComplete — привыполнении CommitTrans .
  • OnRollbackTransComplete — привыполнении RollbackTrans .

Эти события инкапсулированы в компоненте TADOConnection.

События выполнения команд

OnWillExecute и OnExecuteComplete вызываются перед и после выполнением команды.

Эти события инкапсулированы в компоненте TADOConnection , а не в компоненте TADOCommand , как можно было бы предположить. Это связано с тем, что в ADO объекта команды как такого нет и по этой причине он не может получать сообщения.

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

В ADO так же есть события связанные с набором данных, а не с соединением, как вышеописанные. Они инкапсулированы в компоненты имеющие набор данных — TADODataSet, TADOTable, TADOQuery и TADOStoredProc.

Эти события можно разбить на три группы.

1) События выборки данных

  • OnFetchProgress — многократно вызывается в процессе выборки набора данных.
  • OnFetchComplete — завершение выборки.

2) Уведомления об изменении положения текущей записи в наборе.

  • OnWillMove, OnMoveComplete — вызываются до и после изменения положения текущей записи. OnWillMove позволяет отменить действие.
  • OnEndOfRecordset — вызывается при достижении конца набора данных, позволяет добавить новую запись.

3) Уведомления об изменении набора данных

  • OnWillChangeField, OnFieldChangeComplete — до и после изменения текущей записи набора.
  • OnWillChangeRecord, OnRecordChangeComplete — вызываются до и после изменения, добавления, удаления строки набора и отмене этих действий.
  • OnWillChangeRecordset, OnRecordsetChangeComplete — вызываются до и после открытия, закрытия, повторного запроса и синхронизации набора данных.

Многие события допускают прерывание действия. Эта возможность бывает полезна при асинхронной работе с сервером. Например, для прерывания слишком длинного запроса.

Асинхронная работа с сервером

В ADO есть возможность не имеющая аналогов ни в BDE ни в InterBase. Это асинхронное выполнение операций с сервером. Могут асинхронно выполнятся установка соединения с сервером ( Connection ), выполнение команды ( Execute ) и выборка набора данных ( Fetch )

Для включения этого режима необходимо установить свойство ConnectOptions компонента TADOConnection в coAsyncConnect.

При установлении соединения происходит

Вызывается обработчик события OnWillConnect

Управление передается в программу

После окончания соединения, как успешного, так и ошибочного, вызывается обработчик события OnConnectComplete

Асинхронное выполнение команды

Надо заметить, что все компоненты ADO, за исключением компонента TADOConnection при активизации или выполнении исполняют команду ADO. Этикомпоненты TADOCommand, TADODataSet, TADOTable, TADOQuery, TADOStoredProc. Установите в свойстве ExecuteOptionseoAsyncExecute.

При исполнении происходит

Вызывается обработчик события OnWillExecute

Управление передается в программу

После окончания выполнения команды, как успешного, так и ошибочного, вызывается обработчик события OnExecuteComplete

Асинхронная выборка данных

Асинхронная выборка данных поддерживается в компонентах TADODataSet, TADOTable, TADOQuery, TADOStoredProc. Для ее включения установите в свойстве ExecuteOptionseoAsyncFetch.

После исполнения команды происходит передача данных. В процессе передачи многократно вызывается обработчик сообщения OnFetchProgress . В его параметрах есть как количество уже переданных записей, так и общее количество. Это очень удобно для создания индикаторов типа TProgressBar . После того, как выборка с сервера закончена, вызывается обработчик события OnFetchComplete.

Технология ADO и средства доступа к реляционным базам данных

Рубрика: Информационные технологии

Дата публикации: 04.06.2015 2015-06-04


Статья просмотрена: 983 раза

Библиографическое описание:

Абилдаева Г. Б., Жанкоразова Н. Н., Жанадил М. О. Технология ADO и средства доступа к реляционным базам данных // Молодой ученый. — 2015. — №11. — С. 156-158. — URL https://moluch.ru/archive/91/18279/ (дата обращения: 12.11.2020).

Коротко на вопрос «Что такое ADO?» можно ответить так: это основная технология доступа к данным, не только реляционные базы данных для платформы.NET. Более конкретно — это набор объектов, при помощи которых программист может осуществить подключение к серверу баз данных, выборку данных и/или их модификацию.

Многие программисты, работающие с базами данных на платформах Microsoft, могли оценить простоту и удобство технологии ADO — ActiveX Data Objects. Интуитивно-понятный интерфейс и логичный набор объектов вместе с простотой программирования заслуженно получили признание программистов. Несмотря на это, вместе с новой платформой.NET Microsoft представляет и новое поколение средств доступа к базам данных — ADO.NET. Cтремительное развитие веб приложений вызвало необходимость пересмотреть методы работы с источниками данных, лучше адаптировать их к специфики приложений. Непредсказуемый рост числа клиентов интернет сайтов заставляет разработчиков переходить от клиентсерверной к three-tier архитектуре, что часто порождает непреодолимые проблемы. Базы данных не способны поддерживать неограниченное число активных соединений, ограничивая доступность сайта и принося убытки. Брандмауэры могут препятствовать передаче двоичных данных между узлами. ADO.NET призвано решить эти и другие проблемы и вместе с тем сохранить удобство и простоту программирования.

ADO была разработана для архитектуры клиент-сервер. Эта архитектура в течение ряда лет была достаточно прогрессивной, если учесть, что пришла она на смену архитектуре файл-сервер. Потом все нарастающая сложность систем обработки данных потребовала качественного изменения архитектуры: кроме двух уровней клиент и сервер баз данных появляются дополнительные уровни серверы, реализующие бизнес-логику приложений. До сих пор, правда, ни одна из разработанных для этой цели архитектур (в частности, DCOM и CORBA) не добились впечатляющих успехов в этом направлении, и на сегодняшний момент мне известно, пожалуй, больше вирусов, использующих их слабости, чем реально работающих продуктов на их основе..NET в целом и ADO.NET в частности очередная попытка навести порядок в сегменте многоуровневых приложений и сделать их разработку относительно простым и приятным занятием. Что из этого выйдет, судить пока рано, но, на мой взгляд, перспективы неплохи [1].

Поскольку ADO.NET ориентирована на разработку многоуровневых приложений корпоративного масштаба, это отложило неизбежный отпечаток на способы взаимодействия клиента с сервером. Если основной сценарий работы клиента в ADO начинается с создания соединения, которое потом удерживается открытым весь сеанс, то ADO.NET гораздо самостоятельнее в этом отношении. Вполне допустимым является сценарий, когда клиент устанавливает соединение, получает необходимые данные, закрывает соединение, длительное время обрабатывает данные, после чего вновь устанавливает соединение для передачи измененных данных обратно на сервер.

Искушенные в ADO программисты могут возразить, что, мол, мы уже давно имели такую возможность в виде отсоединенных наборов записей. Да, частично они правы. Однако отсоединенные наборы записей стоят несколько особняком в объектной модели ADO, и их функциональность оставляет желать лучшего.

MSDN божится, что при разработке ADO.NET преследовалась цель сделать новую платформу как можно более совместимой с прежней, так что разработчики особой разницы не заметят.

Преимущества и нововведения в ADO.NET. Использование разъединенной модели доступа к данным. В клиент-серверных приложениях традиционно используется технология доступа к источнику данных при которой соединение с базой поддерживается постоянно. Однако после широкого распространения приложений, ориентированных на Интернет, выявились некоторые недостатки такого подхода. Попробуем выявить некоторые из них. Соединения с базой данных требуют выделения системных ресурсов, что может быть критично при большой нагрузке сервера. Хотя постоянное соединение позволяет несколько ускорить работу приложения, общий убыток от растраты системных ресурсов сводит преимущество на нет.

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

Опыт разработчиков показал, что приложения с постоянным соединением с источником данных чрезвычайно трудно поддаются масштабированию.

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

Следует признать, что новая технология иногда все же проигрывает традиционной. Для этих случаев рекомендовано (не только мною, но и Microsoft) использовать ADO.

Хранение данных в объектах DataSet. При работе с базой данных нам чаще всего приходится работать не с одной, а несколькими записями. Более того, данные эти могут собираться из различных таблиц. В разъединенной модели доступа к базе данных не имеет смысла соединяться и источником данных при каждом обращении. Исходя из этого, представляется логичным хранить несколько строк и обращаться к ним при необходимости. Для этих целей и используется DataSet [2].

DataSet представляет собой, по сути, упрощенную реляционную базу данных и может выполнять наиболее типичные для таких баз данных операции. Теперь, в отличие от Recordset мы можем хранить в одном DataSet сразу несколько таблиц, связи между ними, выполнять операции выборки, удаления и обновления данных. Безусловно, разъединенная модель не позволяет постоянно отслеживать изменения в базе данных, производимые другими пользователями. Это может привести к ошибкам в таких приложениях, где информация должна обновляться каждый момент — заказ билетов или продажа ценных бумаг. Однако в любую секунду может быть получена свежая информация из базы данных через вызов метода FillDataSet. Таким образом, DataSet остается чрезвычайно удобным для самого широкого класса приложений: когда необходимо получить данные из базы и как-либо обработать их.

ADO.NET поддерживает два типа источников данных — SQL Managed Provider и ADO Managed Provider. SQL Managed Provider применяется для работы с Microsoft SQL Server 7.0 и выше, ADO Managed Provider — для всех остальных баз данных.

SQL Managed Provider — работает по специальному протоколу, называемому TabularData Stream (TDS) и не использует ни ADO, ни ODBC, ни какую-либо еще технологию. Ориентированный специально на MS SQL Server, протокол позволяет увеличить скорость передачи данных и тем самым повысить общую производительность приложения.

ADO Managed Provider — предназначен для работы с произвольной базой данных. Однако за счет универсальности есть проигрыш по сравнению с SQL Server Provider, так что при работе с SQL Server рекомендовано использовать специализированные классы. В данном обзоре мы коснемся ADO Managed Provider лишь мельком, указав только существующие незначительные различия, так как наиболее употребимой базой данных представляется SQL Server 7.0 или 2000, а разница заключается, в основном, в именовании.

Объекты DataSet ADO.NET. Объект DataSet является центральным элементом поддержки разъединенных распределенных сценариев данных в ADO.NET. Объект DataSet является находящимся в оперативной памяти представлением данных, обеспечивающим согласованную реляционную программную модель, независимо от источника данных. Он может использоваться с несколькими различными источниками данных, XML-данными или для управления данными, локальными по отношению к приложению. Объект DataSet представляет полный набор данных, включая связанные таблицы, ограничения и связи между таблицами. На следующей иллюстрации показана модель объектов DataSet.

ADO.NET DataSet — расположенное в оперативной памяти представление данных, обеспечивающее согласованную реляционную программную модель независимо от источника данных. DataSet представляет полный набор данных, включая таблицы, содержащие, упорядочивающие и ограничивающие данные, а также связи между таблицами.

Существует несколько способов работы с DataSet, которые могут применяться отдельно или в сочетании. Можно выполнить следующие действия:

— Программно создать DataTable, DataRelation и Constraint внутри DataSet и заполнить таблицы данными.

— Заполнить DataSet таблицами данных из существующего реляционного источника данных с помощью DataAdapter.

— Загрузить и сохранить содержимое DataSet с помощью XML-кода.

Строго типизированный DataSet также можно передавать с помощью веб-службы с поддержкой XML-кода. Конструкция DataSet делает его идеальным для передачи данных с помощью веб-служб с поддержкой XML-кода.

Объектная модель DataSet. Методы и объекты DataSet согласованы с методами и объектами модели реляционной базы данных.

Объект DataSet также может сохранять и повторно загружать свое содержимое в виде XML, а свою схему — в виде схемы XSD.

Класс DataTableCollection. Объект ADO.NET DataSet содержит коллекцию, содержащую ноль или более таблиц, представленных объектами DataTable. Коллекция DataTableCollection содержит все объекты DataTable в объекте DataSet.

Объект DataTable определяется в пространстве имен System.Data и представляет собой одну таблицу, находящуюся в оперативной памяти. Он содержит коллекцию столбцов, представленных объектом DataColumnCollection, и ограничений, представленных объектом ConstraintCollection, которые вместе определяют схему таблицы. Объект DataTable также содержит коллекцию строк, представленных объектом DataRowCollection, содержащим данные в таблице. Вместе со своим текущим состоянием объект DataRow сохраняет обе свои версии (текущую и исходную), чтобы определить изменения значений, хранимых в строке.

Класс DataView. DataView позволяет создавать различные представления данных, которые хранятся в DataTable. Эта возможность часто используется в приложениях связывания данных. С помощью объекта DataView можно представлять данные в таблице с различными порядками сортировки, а также фильтровать данные по состоянию строки или на основе критерия фильтра.

Класс DataRelationCollection .Объект DataSet содержит связи в своем объекте DataRelationCollection. Связь, представленная объектом DataRelation, связывает строки в одном объекте DataTable со строками в другом объекте DataTable. Связь аналогична пути соединения, который может существовать между столбцами первичного и внешнего ключей реляционной базы данных. Объект DataRelation определяет совпадающие столбцы в двух таблицах объекта DataSet.

Связи позволяют перемещаться в объекте DataSet от одной таблицы к другой. Важными элементами объекта DataRelation являются имя связи, имена связанных таблиц и связанные столбцы в каждой таблице. Связи могут быть построены с более чем одним столбцом для каждой таблицы путем указания массива объектов DataColumn в качестве ключевых столбцов. При добавлении связи к объекту DataRelationCollection дополнительно можно добавить UniqueKeyConstraint и ForeignKeyConstraint, чтобы обеспечить ограничения целостности в случае изменений значений связанных столбцов.

Основы 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);

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