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" в полето "секретна парола".