Используйте объекты ADO для доступа к данным ODBC в программах DELPHI.
-------------------------------------------------- ----------------------------------
Как энтузиаст ASP, я часто использую объекты ADO на страницах ASP для работы с базами данных ODBC. Я считаю, что использовать ASP для создания систем веб-приложений действительно очень удобно. Хотя в моей карьере программиста автор отдает предпочтение продуктам серии Borland и несколько отталкивает продукты Microsoft, для ASP я являюсь исключением. Однажды мне вдруг пришло в голову, что объект ADO — это стандартный объект OLE. Было бы здорово, если бы ADO можно было использовать для управления базой данных в приложении Delphi. Особенно при использовании DELPHI в качестве приложения сетевой базы данных, если веб-сайт является сайтом WINNT и поддерживает страницы ASP, вы можете использовать объекты ADO для доступа к базе данных ODBC, не загружая на сайт такой большой BDE. Таким образом, вы можете в полной мере использовать преимущества программирования DELPHI и ASP для улучшения ISAPI/NSAPI/CGI. После программирования и тестирования вы можете успешно использовать объекты ADO для доступа к базам данных ODBC в Delphi. Теперь я запишу свой опыт и поделюсь им со всеми, чтобы у нас был другой метод доступа к базам данных ODBC.
В 32-разрядной версии Delphi вы можете объявить вариантную переменную (например, AVariant), а затем создать объект OLE с помощью CreateOleObject, например AVariant:=CreateOleObject('ADODB.Connection'), чтобы получить экземпляр объекта подключения к базе данных. и затем вы можете использовать методы и свойства этого объекта, которые используются для работы с базой данных ODBC.
Ниже приводится краткое введение в объекты ADO, используемые для доступа к базам данных ODBC, а также их методы и свойства.
1. Объект подключения к базе данных (ADODB. Connection)
Этот объект используется для установления соединения с базой данных ODBC, и все операции с базой данных выполняются через это соединение.
Объект подключения к базе данных ADODB Connection функционирует аналогично объекту TDatabase в Delphi.
Метод установления объекта соединения (AConnection — переменная типа Variant):
AConnection:=CreateOleObject('DODB.Connection')
Для установления соединения используется метод Open, а синтаксис использования следующий (на примере объекта AConnection):
AConnection.Open( ConnectionString, UserId, PassWord )
Все три параметра имеют строковый тип, где UserId и Password — это имя пользователя и пароль пользователя, которые можно опустить при использовании для доступа к базе данных, поскольку имя пользователя и пароль пользователя также могут быть указаны в ConnectionString. ConnectionString — это строка, используемая для описания информации об источнике данных ODBC. Ее формат:
'PRovider=ProviderName; DSN=DSNName; SERVER=сервер; UID=пользователь;
в:
Поставщик: поставщик данных, MSDASQL по умолчанию, Microsoft OLEDB, обычно опускается;
DSN: источник системных данных OBDC (DSN), соответствующий открываемой базе данных, является необязательным параметром;
ДРАЙВЕР: имя драйвера, используемого в открываемой базе данных, например, доступ, соответствующий драйверу Microsoft Access (*.mdb), который является необязательным параметром;
СЕРВЕР: имя сервера, на котором расположена открываемая база данных, доступное на этом компьютере (локальном) и является необязательным параметром;
БАЗА ДАННЫХ: имя открываемой базы данных, которое является необязательным параметром;
UID: имя пользователя, используемое для доступа к базе данных, является необязательным параметром;
PWD: пароль пользователя, используемый для доступа к базе данных, является необязательным параметром.
Вышеуказанные параметры являются необязательными, но необходимо предоставить достаточную информацию для описания источника системных данных.
Если системный DSN ODBC определен и называется MyDsn, то для установки соединения с базой данных можно использовать следующий оператор:
AConnection.Open('DSN=MyDsn');
Чтобы предотвратить ошибки запуска приложения, когда DSN не существует или его настройки изменены другими, вы можете использовать ADODB.Connection для создания временного источника данных ODBC. Это может гарантировать правильность настроек параметров используемого нами системного DSN. . Следующий оператор может создать временный системный DSN ODBC, соответствующий базе данных ACCESS, путь — C:Inetpub wwwroot test.mdb:
AConnection.open('Driver= {Microsoft Access Driver (*.mdb)};DBQ=C:inetpub wwwroot est.mdb')
После установки ADODB.Connection, если нет необходимости возвращать результаты операции (например, удаление, изменение, обновление и т. д.), вы можете выполнять обычные операции SQL с базой данных. В это время можно использовать другой метод ADODB.Connection. , Выполнить, используется следующий синтаксис.
AConnection.Execute(strSQL);
Среди них strSQL — это оператор SQL для выполнения операции. Например, операция удаления может быть следующей: delete from wfjcommu. Используйте AConnection.Close, чтобы закрыть соединение с базой данных.
2. Объект набора данных (ADODB.RecordSet).
Если вы хотите выполнять операции запроса и возвращать результаты запроса или хотите более удобно управлять таблицей данных, вам необходимо использовать объект набора данных.
Объект набора данных ADODB.RecordSet действует как объект TTable или TQuery в Delphi.
Метод создания объекта набора данных (ARecordSet — переменная типа Variant):
ARecordSet:=CreateOleObject('ADODB.RecordSet')
Метод получения данных из таблицы данных — метод Open. Конкретный метод использования:
ARecordSet.Open( strCommand, ActiveConnection, int CursorType, intLockType, intCommandType);
в:
strCommand: строка, которая является параметром команды. Это может быть имя таблицы, инструкция SQL или имя хранимой процедуры (StoredProc) на сервере. Конкретный параметр должен быть указан следующим параметром intCommandType.
ActiveConnection: используемое соединение с базой данных представляет собой объект соединения ADODB.
intCursorType: длинное целое число, тип курсора набора данных, необязательные параметры, смотрите комментарии в программе.
intLockType: длинное целое число, тип блокировки таблицы данных, необязательные параметры, смотрите комментарии в программе.
intCommandType: длинное целое число, тип параметра команды, используемый для указания роли strCommand. Вы можете указать strCommand как команду (например, инструкцию SQL), таблицу данных (TTable) или хранимую процедуру (StoredProc). параметры смотрите в комментариях в программе.
Чтобы выполнить SQL-запрос, вы можете использовать следующий оператор:
ARecordSet.Open('Выберите * из wfjcommu',adOpenStatic,ad LockOptimistic,adCmdText);
Другие общие свойства и методы по сравнению с TTable и TQuery следующие (подробности см. в файле справки ASP):
эоф,боф: эоф,боф. MoveFirst, MoveLast: First, LastMovePrevious, MoveNext: Prior, NextMove: MoveByAddNew: AppendUpdate: PostClose: закрыть
Удалить плюс обновление: удалить, все изменения в таблице данных должны использовать обновление, чтобы операция была эффективной, в отличие от Delphi.
Поля[FieldNo]: Поля[FieldNo]
Fields['FieldName']: FieldByName('FieldName')
3. Другие общие объекты (объекты, соответствующие Delphi):
ADODB.Field: TField ADODB.Parameter: TPara ADODB.Error: EDBEngineError
ADODB.Command: Нет ADODB.Свойство: Нет
Давайте посмотрим на пример приложения:
процедура TForm1.Button1Click(Отправитель: TObject);
{*************************************************** ***** ****
Используйте ADO для работы с базой данных ODBC.
В этой программе будет создан временный системный источник данных ODBC, указывающий на базу данных MsAccess, а затем таблицы данных в нем будут отображаться, добавляться, изменяться, удаляться и запрашиваться.
ПРИМЕЧАНИЕ. Пожалуйста, включите модуль ComObj в оператор Uses.
************************************************* * ***}
const{Некоторые объявления констант, подробности см. на сайте adovbs.inc}
{----Постоянное описание CommandType----}
adCmdUnknown = 0008;//Неизвестно, должно оцениваться системой, медленно, значение по умолчанию
adCmdText = 0001;//Командный оператор, например оператор SQL
adCmdTable = 0002; //Имя таблицы данных;
adCmdStoredProc = 0004;//имя хранимой процедуры
{----Постоянное описание CursorType----}
adOpenForwardOnly = 0;//доступен только в одном направлении спереди назад, что является значением по умолчанию
adOpenKeyset = 1;//Изменения данных, внесенные другими пользователями, видны, но добавления и удаления, внесенные другими пользователями, не видны.
adOpenDynamic = 2 //Видны добавления, изменения и удаления данных другими пользователями
adOpenStatic = 3 //Добавления, изменения и удаления данных другими пользователями не видны
{----Постоянное описание LockType---}
adLockReadOnly = 1 //Только чтение, значение по умолчанию;
adLockPessimistic = 2 //При изменении блокируем по одной записи;
adLockOptimistic = 3; //При обновлении после модификации блокировать по одной записи
adLockBatchOptimistic = 4 // Блокировка записи во время пакетного обновления;
вар
AConnection, ARecordSet: вариант;
longintTemp: целое число;
стрТемп: строка;
intIndex: целое число;
начинать
{Создайте временный источник данных ODBC, укажите базу данных MsAccess и используйте этот DSN для установления соединения с базой данных}
AConnection := CreateOleObject('ADODB.Connection');
AConnection.Open('Driver={Microsoft Access Driver (*.mdb)};DBQ=C:inetpubwwwroot est');
{Создайте объект набора данных и извлеките данные из таблицы данных}
ARecordSet := CreateOleObject('ADODB.RecordSet');
ARecordSet.open('wfjcommu',AConnection,adOpenStatic,adLockOptimistic,adCmdTable);
memo1.lines.clear;
memo1.lines.add('Исходное содержимое таблицы данных ******** следующее********');
{Отображение доменного имени каждого домена}
стрТемп := '';
для intIndex:= 0 до ARecordSet.Fields.count - 1 сделать
strTemp := strTemp + ARecordSet.Fields[intIndex].name+';';
memo1.lines.add(strTemp);
{Показать содержимое каждого домена}
пока не ARecordSet.eof делайте
начинать
стрТемп := '';
для intIndex:= 0 до ARecordSet.Fields.count - 1 сделать
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;//Перейти к следующему бару, Далее
конец;
{Добавить запись}
ARecordSet.AddNew;//Добавить,Добавить
ARecordSet.Fields['AName'] := '1';//Доступ по FieldByName
ARecordSet.Fields['Portable'] := '2';
ARecordSet.Fields(2) := '3';//Доступ в виде Fields[index]
ARecordSet.Fields(3) := '4';
ARecordSet.Fields(4) := '5';
ARecordSet.Update;//Обновить, Опубликовать
ARecordSet.MoveFirst;//Перейти к первому элементу First
memo1.lines.add('********Содержимое таблицы данных после добавления записи выглядит следующим образом********');
{Показать содержимое каждого домена}
пока не ARecordSet.eof делайте
начинать
стрТемп := '';
для intIndex:= от 0 до ARecordSet.Fields.count - 1 сделать
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;//Перейти к следующему бару, Далее
конец;
{Изменить последнюю запись}
ARecordSet.MoveLast;
ARecordSet.Fields['AName'] := '11';//Доступ с использованием FieldByName
ARecordSet.Fields['Portable'] := '22';
ARecordSet.Fields(2) := '33';//Доступ в виде Fields[index]
ARecordSet.Fields(3) := '44';
ARecordSet.Fields(4) := '55';
ARecordSet.Update;//Обновить, Опубликовать
ARecordSet.MoveFirst;//Перейти к первому элементу First
memo1.lines.add('********Содержимое таблицы данных после изменения последней записи выглядит следующим образом********');
{Показать содержимое каждого домена}
пока не ARecordSet.eof делайте
начинать
стрТемп := '';
для intIndex:= 0 до ARecordSet.Fields.count - 1 сделать
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;//Перейти к следующему бару, Далее
конец;
{удалить последнюю запись}
ARecordSet.MoveLast;//Перейти к последнему бару Last
ARecordSet.delete;//Удалить, удалить
ARecordSet.Update;//Обновление, в Delphi не требуется
ARecordSet.MoveFirst;//Перейти к первому элементу First
memo1.lines.add('********Содержимое таблицы данных после удаления последней записи следующее********');
{Показать содержимое каждого домена}
пока не ARecordSet.eof делайте
начинать
стрТемп := '';
для intIndex:= 0 до ARecordSet.Fields.count - 1 сделать
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;//Перейти к следующему бару, Далее
конец;
ARecordSet.Close;{Закрыть набор данных}
{Используйте оператор SQL для запроса записей с именем «Чжан Сан»}
{Обратите внимание, что в операторах SQL строки должны быть заключены в одинарные кавычки}
ARecordSet.open( 'выберите * из wfjcommu, где AName = ''Чжан Сан''',
AConnection,adOpenStatic,adLockOptimistic,adCmdText );
memo1.lines.add('********Содержимое Чжан Саня следующее********');
memo1.lines.add('Итого' + IntToStr( ARecordSet.RecordCount) + 'Соответствующие записи');
{Показать содержимое каждого домена}
пока не ARecordSet.eof делайте
начинать
стрТемп := '';
для intIndex:= 0 до ARecordSet.Fields.count - 1 сделать
strTemp := strTemp + ARecordSet.Fields[intIndex].value+';';
memo1.lines.add(strTemp);
ARecordSet.MoveNext;//Перейти к следующему бару, Далее
конец;
{Закрыть набор данных и подключение к базе данных}
ARecordSet.close;
Соединение.закрыть;
конец;
Слушая других, лучше испытать это на себе, увидев реальные примеры. В этом примере мы продемонстрируем, как использовать объекты ADO для запроса, добавления записей, изменения записей и удаления записей в таблице данных. Пожалуйста, обратитесь к комментариям к программе для конкретного использования. Если у вас есть некоторый опыт программирования баз данных Delphi, я думаю, это нетрудно понять.
В нашем примере используется база данных Test.MDB, которая имеет таблицу данных под названием wfjcommu с пятью полями AName, Portable, Tel, BP и PostAddress, которые представляют имя, номер мобильного телефона, номер телефона, номер пейджера и почтовый адрес. соответственно.
Вышеуказанная программа была отлажена и передана под PWIN98+ Delphi 3.0+PWS (персональный веб-сервер) 4.0.