C# & Oracle - заметки на полях - 1Источник: habrahabr
Когда-то давно, очень давно...Компания купила лицензию на БД Oracle. Затем в эту компанию трудоустроился я. Соответсвенно начав продвигать .Net "в массы". БД Oracle используются не во многих организациях, но используется. Как же осуществить взаимодействие с БД Oracle, используя C#? Оговорюсь заранее, я не гуру Oracle; а так же не гуру красивого использования паттернов, но я стараюсь и Но оставим философствования. Займёмся поставленной задачей. Перво-наперво необходимо подготовить "среду": 1. Поставить клиент Oracle, без которого взаимодействие с БД не осуществить. 2. Настроить TNS под свои нужды. 3. Создать проект в Visual Studio. 4. Добавить reference на сборку System.Data.OracleClient.dll, посредством которой и будем "манипулировать" БД. Подготовим почву, пожалуй сделаем БД военкомата. В простейшем случае, для этого хватит одной таблицы:
Идентификатор, Имя, Фамилия, Возраст, Рост, Биография. Вес нас не интересует. Определим процедуры для добавления, на мой взгляд самое интересное, далее я объясню почему:
Удаление:
Получение данных:
Теперь я объясню что интересного в процедуре добавления нового пользователя - объект типа CLOB. Это тип способен хранить строковые данные, размером до 4 гигабайт, в отличие от Varchar, способного оперировать строками до 4000 байт. Т.е. если вы попытаетесь создать VARCHAR поле размером 5000, то получите суровый "облом". Но те кто работал с типом CLOB из C# знают, что это очень по "челябенски". Но я забегаю вперёд, обо всём попорядку. При работе с Oracle есть один неприятный момент, если явно не закрывать соединение, то количество курсоров будет после SELECT`a будет рости в геометрической прогрессии. Данная проблема решается "в лоб": Создание и открытие соединения
таким образом, за вас всю черновую работу сделает IDisposable. Если обратить внимание на конструктор OracleConnection, то увидите что есть 2 варианта, "пустой" и с использованием строки, описывающей соединение с БД. Строка имеет примерно такой вид: Data Source=out_database_name;Password=our_password;User ID=our_username Я думаю в объяснениях, что здесь что, данная строчка не нуждается. Следующим шагом стоит открыть соединение:
Создание командыТеперь мы готовы исполнять команду. После использования команды её тоже необходимо "освободить", не будем отходить от принципов и воспользуемся всё той же замечательной конструкцией using:
Давайте разберёмся что делает данный "кусок" кода: вначале создаётся команда, ей присваивается соединение, в рамках которого будет работать наша команда. Затем указывается тип команды, всего выделяется 3 типа: 1. StoredProcedure - Имя хранимой процедуры. 2. TableDirect - Имя таблицы. 3. Text - Текстовая команда SQL. (По умолчанию). Следующий параметр - текст, непосредственно имя хранимой процедуры или команда. В нашем случае будет использована хранимая процедура с именем "GET_CONscriptS" Отлично перейдём Использование передаваемых параметровОговорюсь сразу, использовать параметры можно и с CommandType.Text, ниже я покажу как это делается. Пока же вернёмся с нашим параметрам:
Что происходит здесь: создали параметр, указали что он работает на "выход" и указали тип параметра ( более подробную информацию о используемых типах а так же их совместимости со стандартными типами .Net можно узнать из MSDN ). Если бы параметр работал на "вход", то нужно было бы указать и значение - Value. Прикрепили параметр к команде и… Выполнение команды
команда выполнена… теперь можно "выгребсти" данные например так:
Возвращаемый параметр, представляет собой курсор, который можно прочитать, как OracleDataReader. Как разбирать параметр оставим в качестве "домашнего задания" ;). На посошокВ заключении, я хочу рассказать про то как передать параметр в текст, а точнее я покажу:
Как видите вся хитрость заключается в использовании знака - :. В следующей статье я расскажу про работу с CLOB и приведу свой код, заточенный под меня. |