C# & Оракул - маргинални бележки

Имало едно време, много отдавна.

Компанията закупи лиценз за базата данни Oracle. След това си намерих работа в тази фирма. Съответно започва да популяризира .Net "в масите". Базите данни на Oracle не се използват в много организации, но се използват. Как да взаимодействам с база данни на Oracle с помощта на C#?

Ще направя резервация предварително, не съм гуру на Oracle; и също така не съм гуру на красивото използване на шаблони, но се опитвам да знам къде е пайът; подхождам към въпроса философски, знам какво е, знам какво искам, но го използвам по начина, по който ми трябва.

Но да оставим философстването. Да се ​​заемем със задачата. Първата стъпка е да подготвите „средата“: 1. Инсталирайте клиента Oracle, без който не може да се осъществи взаимодействие с базата данни. 2. Персонализирайте TNS, за да отговаря на вашите нужди. 3. Създайте проект в Visual Studio. 4. Добавете препратка към сборкатаSystem.Data.OracleClient.dll, чрез която ще „манипулираме“ базата данни.

Нека подготвим почвата, може би ще направим база данни на службата за военна регистрация и вписване. В най-простия случай една таблица е достатъчна за това:

създаване на таблица CONSCRIPT_INFO ( >не null, FIRST_NAME VARCHAR2(128), LAST_NAME VARCHAR2(128), AGES NUMBER, GROWTH FLOAT, BIOGRAPHY CLOB, ограничение PK_CONSCRIPT_INFO първичен ключ (ID) );

Идентификатор, име, фамилия, възраст, ръст, биография. Теглото не ни интересува.

Нека да дефинираме процедурите, които да добавим, според мен най-интересните, след което ще обясня защо:

PROCEDURE ADD_CONSCRIPT (FirstNameIn IN VARCHAR2, LastNameIn IN VARCHAR2, AgesIn IN NUMBER, GrowthIn IN FLOAT, BiographyIn IN CLOB) IS BEGIN INSERT INTO CONSCRIPT_INFO ( ID, FIRST_NAME, LAST_NAME, ВЪЗРАСТ, РАСТ, БИОГРАФИЯ ) ЦЕННОСТИ ( CONSCRIPT_INFO_SEQ.NEXTVAL, FirstNameIn, LastNameIn, AgesIn, GrowthIn, BiographyIn ); КРАЙ ;

ПРОЦЕДУРА DELETE_CONSCRIPT (Наборник >В БРОЙ) Е НАЧАЛО

DELETE FROM CONSCRIPT_INFO WHERE > КРАЙ ;

ПРОЦЕДУРА GET_CONSCRIPTS (ConscriptsOut OUT sys_refcursor) Е НАЧАЛО

OPEN ConscriptsOut ЗА SELECT * FROM CONSCRIPT_INFO;

Сега ще обясня какво е интересното в процедурата за добавяне на нов потребител - обект от тип CLOB. Този тип е в състояние да съхранява низови данни с размер до 4 гигабайта, за разлика от Varchar, който може да работи с низове до 4000 байта. Тези. ако се опитате да създадете поле VARCHAR с размер 5000, ще получите сериозен "неприятен проблем". Но тези, които са работили с типа CLOB от C#, знаят, че това е много "Челябенск". Но аз изпреварвам себе си, най-важното.

Когато работите с Oracle, има един неприятен момент, акоизричноне затвори връзката, тогава броят на курсорите след SELECT ще нарасне експоненциално. Този проблем се решава "на челото":

Създайте и отворете връзка

използвайки (OracleConnection връзка = нов OracleConnection()) . >

по този начин IDisposable ще свърши цялата тежка работа вместо вас. Ако обърнете внимание на конструктораOracleConnection, ще видите, че има 2 опции, „празна“ и използваща низ, описващ връзката към базата данни. Низът изглежда по следния начин:Data Source=out_database_name;Password=our_password;User > Мисля, че този ред няма нужда от обяснения, какво е какво тук.

Следващата стъпка е да отворите връзката:

Създаване на екип

Сега сме готови да изпълним командата. След като използвате командата, тя също трябва да бъде „освободена“, ние няма да го направимотклоняват се от принципите и използват същата чудесна конструкцияизползвайки:

използване на (OracleConnection връзка = нова OracleConnection()) използване на (OracleCommand команда = нова OracleCommand()) команда.Връзка = връзка; command.CommandType = System.Data.CommandType.StoredProcedure; command.CommandText = "GET_CONSCRIPTS" ; > >

Нека да видим какво прави това "парче" код: първо се създава екип, присвоява му се връзка, в която нашият екип ще работи. След това се посочва типът на командата, като се разграничават общо 3 вида: 1. StoredProcedure - Името на съхранената процедура. 2. TableDirect - Името на таблицата. 3. Текст - SQL текстова команда. (По подразбиране).

Следващият параметър е текст, директно името на съхранената процедура или команда. В нашия случай ще използваме съхранена процедура с име"GET_CONSCRIPTS"

Използване на предадени параметри

Ще направя резервация веднага, можете да използвате параметри сCommandType.Text, по-долу ще покажа как се прави това.

Засега обратно към нашите настройки:

OracleParameter ConscriptsOut = нов OracleParameter() ParameterName = "ConscriptsOut" , Direction = System.Data.ParameterDirection.Output, OracleType = OracleType.Cursor >;

Какво се случва тук: създадохме параметър, посочихме, че работи за "изход" и посочихме типа на параметъра (за повече информация относно използваните типове и тяхната съвместимост със стандартните .Net типове вижте MSDN). Ако параметърът работи като "вход", тогава ще е необходимо да се посочи стойността -Value. Прикачи параметър към командата и...

Изпълнение на команда

командата е завършена ... сега можете да "извадите" данните по този начин:

DataTable таблица = новоТаблица с данни(); table.Load(command.Parameters[ "ConscriptsOut" ].Value as OracleDataReader);

Параметърът за връщане е курсор, който може да се чете като OracleDataReader. Нека оставим как да анализираме параметъра като "домашна работа";).

На пътя

В заключение искам да говоря за това как да предам параметър към текста, или по-скоро ще покажа:

използване на (OracleConnection връзка = нова OracleConnection()) използване на (OracleCommand команда = нова OracleCommand()) команда.Връзка = връзка; command.CommandType = System.Data.CommandType.Text; command.CommandText = @"SELECT * FROM CONSCRIPT_INFO WHERE AGES ;

OracleParameter maxAges = нов OracleParameter() ParameterName = "max_ages" , Direction = ParameterDirection.Input, OracleType = OracleType.Number, Value = 27 >;

OracleDataReader reader = command.ExecuteReader();

Както можете да видите, номерът е да използвате знака -:.

В следващата статия ще говоря за работата с CLOB и ще дам моя код, съобразен с мен.

И тук можете да получите грант за тестов период на Yandex.Cloud. Необходимо е само да въведете "Habr" в полето "секретна парола".