Ado подключение к oracle
Этот поставщик OLE DB для Oracle (Майкрософт) позволяет ADO получать доступ к базам данных Oracle.
Типичная строка подключения
Типичная строка подключения для этого поставщика:
Строка состоит из следующих ключевых слов:
Ключевое слово | Описание |
---|---|
Поставщик | Указывает поставщика OLE DB для Oracle. |
Источник данных | Указывает имя сервера. |
Идентификатор пользователя | Указывает имя пользователя. |
Пароль | Указывает пароль пользователя. |
при подключении к поставщику источника данных, который поддерживает проверку подлинности Windows, следует указать Trusted_Connection = yes или Integrated Security = SSPI вместо сведений об идентификаторе пользователя и пароле в строке подключения.
Provider-Specific параметры подключения
Поставщик поддерживает несколько параметров подключения, определенных для поставщика, в дополнение к параметрам, определенным ADO. Как и в свойствах подключения ADO, эти свойства, определенные поставщику, могут быть задатки через коллекцию Свойств подключения или в составе ConnectionString.
Эти параметры полностью описаны в справочнике программиста OLE DB. (Индекс динамического свойства ADO обеспечивает перекрестную ссылку между этими именами параметров и соответствующими свойствами OLE DB.)
Ручка окна
Указывает на ручку окна, которую нужно использовать для запроса дополнительных сведений.
Идентификатор locale
Указывает уникальный 32-битный номер (например, 1033), который указывает предпочтения, связанные с языком пользователя. Эти параметры указывают форматирование дат и времени, сортировку элементов в алфавитном порядке, сравнение строк и так далее.
Службы OLE DB
Указывает битмаску, которая указывает службы OLE DB, чтобы включить или отключить.
Prompt
Указывает, следует ли подсказать пользователю во время подключения.
Расширенные свойства
Строка, содержащая сведения о расширенном подключении для конкретного поставщика. Используйте это свойство только для сведений о подключении, которые не могут быть описаны с помощью механизма свойств.
При разработке программного обеспечения всегда руководствовался простым правилом, чем меньше в развивающемся проекте используется сторонних компонентов, платформ, технологий, тем лучше. Почти все гениальное — просто. К сожалению, у разработчика не всегда есть возможность свободного выбора средств и систем, с которыми он работает. Вот и мне достался проект Windows Forms + ODAC + Oracle DB Server.
С большой радостью узнал о выходе Oracle Data Access Components (ODAC) for Microsoft Entity Framework and LINQ to Entities (Beta2). Очень ждал этого момента и вот свершилось! Можно не использовать сторонние ORM — все под ключ.
Как научить приложение использовать Entity Framework через установленный на конечных машинах клиент ODAC — описано в пошаговой инструкции от Oracle. Кому интересно, как избавиться от необходимости установки клиента Oracle на машинах пользователей, прошу под кат.
Общие требования
Подключаемые библиотеки
- «путь к клиенту»\client_1\oci.dll (~ 1 MB)
- «путь к клиенту»\client_1\orannzsbb11.dll (~1.2 MB)
- «путь к клиенту»\client_1\bin\OraOps11w.dll (~ 0.3 MB)
- «путь к клиенту»\client_1\oraociei11.dll (~ 130 MB)
Этого достаточно для обеспечения доступа к БД без установки клиента на машине пользователя:
private bool TestConnect()
try
var oracleConnection = new OracleConnection
ConnectionString =
"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ServerNameOrIP)(PORT=PortNumber)))(CONNECT_DATA=(SERVICE_NAME=DBName)));User >
>;
oracleConnection.Open();
var oracleCommand = new OracleCommand
CommandText = "select sysdate from dual" ,
Connection = oracleConnection,
Transaction = null
>;
var oracleDataAdapter = new OracleDataAdapter ;
var sysDateDataSet = new DataSet( "SomeName" );
oracleDataAdapter.Fill(sysDateDataSet, "dateTimeTable" );
return sysDateDataSet.Tables[0].Rows.Count > 0;
>
catch (Exception exx)
MessageBox.Show( string .Format( "Could not connect directly to an Oracle database: \n " , exx.Message));
return false ;
>
* This source code was highlighted with Source Code Highlighter .
Что необходимо сделать для использования Entity Framework Model без установки клиента Oracle
В файл конфигурации проекта (App.Config/Web.Config) будет автоматически (если вы выберете данный соответствующий пункт в мастере) добавлена строка подключения к БД Oracle:
Тут стоит обратить особое внимание на то, что значение, присвоенное атрибуту «provider connection string» обязательно должно быть в двойных кавычках (для их обозначения необходимо использовать код &_q_u_o_t). Это также стоит учесть при динамическом формировании строки подключения.
Тонкости
При динамическом подключении модели к БД «правильным» методом от MS, следует обратить внимание на не совсем корректное формирование строки подключения через объект EntityConnectionStringBuilder
string providerName = "Oracle.DataAccess.Client" ;
string dataSourse = (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ServerNameOrIP)(PORT=PortNumber)))(CONNECT_DATA=(SERVICE_NAME=DBName)));User > var sqlBuilder =
new SqlConnectionStringBuilder
DataSource = dataSourse
>;
string providerString = sqlBuilder.ToString();
var entityBuilder =
new EntityConnectionStringBuilder
Provider = providerName,
ProviderConnectionString = providerString,
Metadata =
@"res://*/HRModel.csdl|res://*/HRModel.ssdl|res://*/HRModel.msl"
>;
using ( var conn =
new EntityConnection(entityBuilder.ToString()))
conn.Open();
Console .WriteLine( "Just testing the connection." );
conn.Close();
>
* This source code was highlighted with Source Code Highlighter .
В результате entityBuilder.ToString() вернет строку подключения с лишними одинарными кавычками, в которые заключено полностью значение атрибута provider connection string
metadata=…;provider=Oracle.DataAccess.Client;provider connection string= ' Data Source= \" (DESCRIPTION=(… ); User color="red">\"'
metadata=…;provider=Oracle.DataAccess.Client;provider connection string= \" Data Source=(DESCRIPTION(…); User color="red">\"
private bool DynamicConnect()
const string providerName = "Oracle.DataAccess.Client" ;
const string serverName = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=ServerNameOrIP)(PORT=PortNumber)))(CONNECT_DATA=(SERVICE_NAME=DBName)));User >;
const string metadata = "metadata=res://*/HRModel.csdl|res://*/HRModel.ssdl|res://*/HRModel.msl" ;
var entBild = string .Format( "metadata=;provider=;provider connection string=\"Data Source=\";" , metadata, providerName, serverName);
try
var conn = new EntityConnection(entBild);
conn.Open();
var hrEntities = new HREntities(conn);
var tmpResult = hrEntities.BRIDGE.Count();
conn.Close();
return true ;
>
catch (Exception exx)
MessageBox.Show( string .Format( "Could not connect directly to an Oracle database: \n " , exx.Message));
return false ;
>
>
* This source code was highlighted with Source Code Highlighter .
Быть может это отголоски бета версии – посмотрим как будет в релизе, который, как обещает Oracle, состоится в четвертом квартале 2011 года.
Эта функция будет удалена в следующей версии Windows. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. Вместо этого используйте поставщик OLE DB Oracle.
поставщик OLE DB для Oracle (Майкрософт) позволяет ADO получать доступ к базам данных Oracle.
Параметры строки подключения
Чтобы подключиться к этому поставщику, установите аргумент поставщика свойства ConnectionString :
Чтение свойства Provider также вернет эту строку.
Если запрос на участие с набором ключей или динамическим курсором выполняется в базе данных Oracle, возникает ошибка. Oracle поддерживает только статичный курсор только для чтения.
Специальные предложения
0) Да патаму чта матчасть учить надо.
Коннекшн=Новый COMОбъект("ADODB.Connection");
ДатаЛинк=Новый COMОбъект("DataLinks");
ДатаЛинк.PromptEdit(Коннекшн);
По-моему, проще всего создать файл с расширением udl и его открыть. Результат будет сохранен в этом файле.
(2) все нормальные люди так и делают (ссылку же на мисту я не просто так дал), а на ИС даже консоль ADO было, там как раз через udl.
(0) Я его отыскал вчера. При всем при этом в гугле только три ссылки (не считая этой статьи) при поиске Новый COMОбъект("DataLinks");
(2) А еще можно через msqry32.exe в графике запрос построить, но это совсем другая история.
Да, это очень полезно.
Непонятно только почему 1С не использует этот механизм в своей обработке "ВыгрузкаДанныхВРеляционныеСтруктуры"
в обработке по обмену сделал кнопку - тестовое соединение
на случай отладки при изменении строки соединения и прописал так:
Попытка
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Provider=SQLOLEDB.1;Password="+СокрЛП(Объект.ПарольADODB)+";Persist Security Info=True;User ;Initial Catalog=BGNAT-SS;Data Source=bgnat-ss.database.windows.net,1433;Connection Timeout=30";
// ВНИМАНИЕ! Установка точект остановки при отладке до этой строки даст сбой - что бы не делали будет: Provider=MSDASQL.1 вместо Provider=SQLOLEDB.1
ДатаЛ = Новый COMОбъект("DataLinks");
ДатаЛ.PromptEdit(Соединение);
Соединение.Open();
Сообщить(Соединение.ConnectionString);
Соединение.Close();
Исключение
Предупреждение("Не удалось создать подключение!");
КонецПопытки;
методом тыка выяснено что если точку останова поставить на любой из этих 2 строк - работать не будет даже этот мастер подключения
Соединение = Новый COMОбъект("ADODB.Connection");
Соединение.ConnectionString = "Provider=. ";
Уже много лет для управления предприятиями (заводами, фабриками, магазинами) человечество использует компьютеры, на которых, в качестве основного приложения, функционирует СУРБД (система управления реляционными базами данных). Они представляют огромное подспорье в управлении предприятиями, позволяя хранить, модифицировать (обновлять, редактировать, добавлять, удалять) терабайты информации. Воспользовавшись, затем, определённым инструментарием можно получать объективные отчёты по данным, хранящимся в БД.
Существует много различных СУРБД. Но так случилось (и этому способствовало много предпосылок), что в абсолютные лидеры (по популярности, распространённости и мощности) вырвалась одна из них. Называть её имя я пока не буду, а предложу лучше взглянуть на следующую иллюстрацию:
Рейтинг СУРБД на российском рынке
Delphi + Oracle
Запускаем Delphi. Аккуратно положим на формочку тот же набор компонентов, который мы кладём для подключения к БД Access. Ну, если вы из тех единиц, которые этого ни разу не делали (может быть просто, вы не пишете на Делфи), то вкратце скажу: с закладки Data Controls палитры компонентов поместите на форму DBGrid, с закладки DataAccess - компонент DataSource, затем перейдите на закладку ADO и добавьте компоненты ADOConnection и ADOQuery. Для простоты не будем изменять их имена, пусть называются именами по умолчанию. Настроим ADOConnection1. Как вы знаете, он служит для задания пути к базе данных и способа открытия таблицы (задания драйвера базы данных). В принципе, его можно было не создавать, а воспользоваться предоставленным для этого свойством компонента ADOQuery. Но, конечно, правильнее воспользоваться именно компонентом ADOConnection, потому что, скорее всего из одной базы данных вам надо будет открыть несколько таблиц, то есть использовать один путь к базе данных, заданный один раз в этом объекте. Как программист (администратор) Oracle вы знаете, что в одной базе данных может находиться тысячи таблиц. Настроим путь к базе данных. Для этого в свойстве ConnectionString компонента ADOConnection1 щёлкним на кнопке с многоточием. Откроется знакомое окно выбора поставщика данных. Выберем драйвер Oracle Provider for OLE DB.
Выбор драйвера БД
На следующей вкладке («Подключение») введём данные для подключения к базе данных. «Источник данных» - это имя базы данных. Если в процессе установки Оракла, при создании базы данных вы не изменили значение по умолчанию, то это orcl. Для простоты, в качестве пользователя зададим привилегированного пользователя system. Для экспериментов пойдёт, но для реальной работы в компании с десятками и сотнями пользователей нужно серьёзно подойти к этому вопросу и работать с данными от имени специально созданного пользователя («возможно, это Вы»). Впрочем, если у админа базы данных голова не забыта дома, то он сам об этом позаботится. В качестве пароля, введём тот, который вы задали при установке и создании базы данных Оракл. Проверим коннект, щёлкнув по соответствующей кнопке, если всё окей, ставим галочку «Разрешить сохранения пароля» и нажимаем OK. Если же нет, то восстанавливливаем в памяти имя базы данных и пароль. Затем, в инспекторе объектов свойству LoginPrompt присвоим значение False, чтобы при подключении к базе данных ADO не требовала имя и пароль. Можно сейчас подключиться к Ораклу, установив свойство Connected в значение True. Теперь соединим компоненты.
Знающие могут смело пропустить этот абзац, не знающие, прошу, читайте. Для DBGrid1 в качестве значения свойства DataSource выберите DataSource1. Для DataSource1 свойству DataSet выберите ADOQuery1.
Теперь, настроим ADOQuery1. Собственно, этот компонент и будет извлекать данные из заданной таблицы. Как видно по имени этого объекта, он работает с данными посредством запроса. Конечно, можно было воспользоваться другим компонентом, например, ADOTable, который открывает таблицу полностью и позволяет работать с данными посредством языка Delphi. Как раз поэтому, мы вынуждены от него отказаться, потому что в таблицах базы данных Оракл может быть слишком много данных, которые нам не нужны; к тому же все эти данные (в реале) придётся передавать по сети. Используя запрос, мы сможем попросить у Оракла только нужные нам данные, не грузя ни его самого (в смысле Оракла), ни сеть. Первым делом, для свойства Connection установим значение - имя объекта связи ADOConnection1. После этого откроем редактор запроса (активизировав свойство SQL). Здесь, возможен вопрос: какую таблицу мы хотим открыть? Действительно, какую? В Оракл имеется огромное количество разных системных таблиц. Ну, и пускай они имеются. Предлагаю создать свою. Я, например, решил посвятить таблицу книгам, и назвал её books. Вы, конечно, можете создать любую другую. OK. Открываем SQL*Plus, пишем запрос - создаём таблицу. Вот как выглядит окно программы SQL*Plus в моём случае:
Запрос для создания таблицы
Заполнять её мы уже будем из программы написанной на Delphi. Возвращаемся к проекту. Сейчас подключимся к созданной таблице. Для этого в редакторе запроса свойства SQL компонента ADOQuery1 напишем: select * from books. Ну, собственно, пока оттуда выбирать нечего, но хотя бы, заголовки, и то вперёд. Теперь активизируем этот запрос (свойство Active (в инспекторе объектов) поставим в True). Если всё сделано правильно, то в объекте отображения данных появятся заголовки созданной таблицы.
Если сейчас откомпилировать, запустить приложение и ввести данные (после этого переместить табличный курсор на какую-нибудь другую запись), то они сохранятся в таблице базы данных Oracle, как будто это любая другая локальная таблица! Осталось только добавь кнопку для обновления данных. В обработчике нажатия на ней напишим такой код:
Вот, собственно, результат достигнут: нам удалось подключиться к базе данных Оракл с помощью ADO, извлечь и модифицировать данные из таблицы. Конечно, вы можете добавить всю функциональность, которую вы добавляете к своим приложениям, работающим с локальными базами данных, например: вставка, удаление записи и другое. Замечу, многое можно сделать, сразу на стороне сервера, отправив запрос. Этим вы не только упростите себе жизнь, написав одну команду на языке SQL, вместо десятка на языке Delphi, но и сделаете приятней жизнь пользователям своей программы, сократив время ожидания результата, выполнив запрос сразу на сервере, и только обновив данные в окне своей программы.
dbExpress
Параметры подключения к БД
Естественно, на иллюстрации я скрыл свой реальный пароль, поскольку в этом окне он отображается в открытом виде (!). Затем, как в прошлый раз свойству LoginPrompt (уже в инспекторе объектов) присвоим значение False, чтобы каждый раз при подключении не вводить имя и пароль. И, наконец, Connected постаим в True. Всё, мы в базе. Теперь надо создать таблицу и потом к ней подключится. В общем, для работы с таблицами (подобно компоненту ADOQuery с закладки ADO) служит подобъект DataSet компонента SimpleDataSet. Развернём список его свойств. Ничего не будем настраивать, поскольку мы напишем код, только проверим, чтобы свойству CommandType было присвоено значение ctQuery, мы ведь желаем использовать запросы для доступа к таблицам по причинам указанным выше. Добавим на форму ещё одну кнопку, обзовём её: «Создать таблицу». Если вы, как я, неравнодушны к литературе, то есть следуете за мной ещё с прошлой таблицы, то создайте событие и напишите в нём такой код:
Этот код, сначала отключает набор данных, поскольку у меня в программе он включается в начале работы программы для извлечения данных из ранее созданной таблицы, вы, естественно можете это не писать. Затем, в свойство CommandText подобъекта DataSet объекта SimpleDataSet помещается SQL-запрос, который создаёт таблицу books2 аналогичную таблице books. Следующим действием, этот запрос выполняется. Весь этот код заключён в безопасный блок, для того, чтобы перехватить исключение. В общем, по комментариям всё ясно. После блока обработки исключительной ситуации (здесь, блока игнорирования) программа подключается к только, что созданной таблице. Процедура Table_Update выглядит следующим образом:
Я её написал по той простой причине, что включённый в неё блок кода вызывается на протяжении программы много раз; изменяется только командная строка - запрос. Поэтому, при вызове я передаю его в качестве параметра. Удаление таблицы вы реализуете сами, если что, смотрите мою программу. Если сейчас откомпилировать, запустить программу, затем, создать таблицу, и попробовать ввести данные, то они не сохранятся в таблице БД Оракл. Видно ADO круче, чем dbExpress. Ну, не зря же мы проделали всю эту работу по подключению к БД с помощью компонента SimpleDataSet. Конечно, не зря. Это я сделал для того, чтобы показать, что с помощью языка SQL в Оракл можно делать хоть что, и писать на нём ото всюду, откуда только возможно подключится к БД. OK. Создадим ещё одну кнопочку. Обзовём её «Скопировать данные». Дважды щёлкнем на ней и напишем такой код:
Здесь, в каждой итерации цикла выполняется могучий SQL-оператор insert, который вставляет в таблицу books2 записи из таблицы books. Цикл заканчивается тогда, когда все записи таблицы books будут скопированы. Сделав это, мы увидели всю силу и мощь Delphi + SQL = Oracle! Я описал не всю функциональность программы, так что полную версию программы вы можете посмотреть, открыв исходник, который находится в папке DelphiOracle.
Delphi6
Рассмотрим, также, случай с Delphi6. Если вам это не надо, не читайте этот раздел. У кого по прежнему стоит шестая версия (мне вас, действительно, жалко) создайте новый проект и читайте дальше. В этом проекте я только покажу, как в шестой версии Делфи написать приложение для подключения к ранее созданной таблице books БД Оракл. Проект будет находиться в папке D6Oracle. Поместите на форму объект для обозрения данных, DataSource и два компонента с закладки dbExpress: SQLConnection и SQLClientDataSet. Вот, собственно, все отличия: за место одного в седьмой версии, два в шестой. Сначала, настройте SQLConnection1 подобно подобъекту связи компонента SimpleDataSet1, затем, подключив его через соответствующее свойство к компоненту SQLClientDataSet1, настройте последний соответствующим образом (подобно, подобъекту DataSet компонента SimpleDataSet1, как мы делали в седьмой версии Делфи). Только, не забудьте, в значение свойства CommandText написать такой запрос: select * from books, чтобы подключиться к этой таблице и изъять из неё данные. Соединив все компоненты, активируйте это хозяйство, через компонент SQLClientDataSet1. Данные из таблицы предстанут перед вашим взором! Заметьте, это есть dbExpress, и он не может напрямую обновлять данные, поэтому, чтобы осуществить обновление данных, вам надо будет встраивать самописные SQL-запросы. Но, как мы видели - это не проблема.
Конец
В этой статье описаны далеко не все возможности написания приложений под БД Оракл на Делфи. Но, чтобы всё описать, нужен не один толстенный томик. Да, я и не ставил перед собой цели сделать это, главное - дать импульс к изучению, а в дальнейшем вы и без меня найдёте необходимую информацию. Осваивайте много разных программных продуктов (и способов работы с ними), можете быть уверены, в жизни пригодится! Удачи!
В архиве в папке DelphiOracle вы найдёте весь исходный код программы, рассмотренной в первой части статьи, а в папке D6Oracle - программу, которая рассмотрена во второй части.
Параметры подключения Provider-Specific
Поставщик поддерживает несколько параметров соединения, зависящих от поставщика, помимо тех, которые определены в ADO. Как и в случае со свойствами соединения ADO, эти свойства, зависящие от поставщика, можно задать через коллекцию свойств соединения или как часть ConnectionString.
Эти параметры полностью описаны в справочнике по программисту OLE DB. Индекс динамического свойства ADO обеспечивает перекрестную ссылку между этими именами параметров и соответствующими свойствами OLE DB.
Однако вчера я нашел решение данной проблемы и оно оказалось очень простым (впрочем, как и все гениальное):
1С 8:
1С 7.7:
Подключив этот код к кнопке вы получите автоматическую генерацию строки подключения.
Параметры строки соединения
Чтобы подключиться к поставщику, задайте для аргумента поставщика свойства ConnectionString значение:
При чтении свойства поставщика также будет возвращена эта строка.
Если запрос на соединение с набором ключей или динамическим курсором выполняется в базе данных Oracle, возникает ошибка. Oracle поддерживает только статический курсор только для чтения.
Типичная строка подключения
Типичная строка подключения для этого поставщика:
Строка состоит из этих ключевых слов:
Поставщик
Указывает поставщика OLE DB для Oracle.
Источник данных
Указывает имя сервера.
Идентификатор пользователя
Задает имя пользователя.
Password
Указывает пароль пользователя.
Читайте также: