На этот раз моя задача состояла в том, чтобы
написать программу, которая могла бы по запросу извлекать вектор-состояния из
базы данных Oracle.
Скажу сразу, у нас такая задача уже была, но
настроена она была под 8-й и 10-й oracle клиенты, и работала с другой базой данных по
другой технологии.
Итак, задача: необходимо получить данные с сервера,
на котором установлена СУБД Oracle(версию, честно сказать, не узнавал), используя версию клиента 10 и более, а
затем произвести с ними некоторые манипуляции.
Казалось бы, нет ничего проще, подключаемся к БД, пишем запрос и получаем результат. Однако на практике все может оказаться
сложнее. Так как Oracle в отличие от SQL Server автоматически не интегрируется с Visual Studio,придется это делать вручную.
Как обычно решений у этой задачи несколько, но
начало у всех одинаково - необходимо установить клиент oracle, благо клиент 10-й версии у меня уже был, и настроить в нем доступ к базе
данных. Для этого необходимо найти файл с названием «C:\...\oracle\product\10.2.0\client_1\Network\Admin\tnsnames.ora».
И заполнить его согласно образцу:
DEBRIS =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.?.???)(PORT = ???))
)
(CONNECT_DATA =
(SERVICE_NAME = debris)
)
)
Тут debris – это имя БД. После этого начинаются различия.
Способ первый:
Способ первый:
- необходимо открыть ODBC Administrator и создать там аналогичную запись для драйвера Microsoft ODBC for ORACLE
- затем в Visual Studio необходимо добавит базу данных, при этом указать поставщика Microsoft ODBC и его настройки;
- в настройках поставщика можно проверить подключение
- далее пишем код получения данных
using System.Data.Odbc;
public void GetData(Action"<"DataItems Exception">" callback)
{
DataItems item = null;
Exception exc = null;
var dtable = new DataTable();
const string conectionString = @"Dsn=debris;uid=oper;pwd=oper;server=debris";
const string queryString = @"SELECT * FROM STAR.VEC_CAT WHERE (ID_KO = 23024)
ORDER BY DWRD DESC";
try
{
using (var ocon = new OdbcConnection(conectionString))
{
var orcCommand = new OdbcCommand(queryString);
ocon.Open();
dtable.Load(orcCommand.ExecuteReader());
if (dtable.DefaultView != null) item = new DataItems(dtable.DefaultView);
}
}
catch (Exception ex)
{
exc = new Exception(ex.Message);
}
finally
{
callback(item, exc, conectionString);
}
- пример работы функции:
public MainViewModel(IDataService dataService)
{
_dataService = dataService;
_dataService.GetData(
(items, error) =>
{
if (error != null)
{
Error = error.Message;
return;
}
DataBaseView = items.DbData;
});
}
Такой способ использовался при получении информации из БД в более ранних проектах, однако из-за другой версии oracle на сервере это решение вело себя неустойчиво.Способ второй:
- необходимо открыть ODBC Administrator и создать там запись для клиента Oracle;
- в Visual Studio выбрать соответствующего поставщика;
- для получения данных использовать следующий код:
using System.Data.OracleClient;
public void GetData(Action"<"DataItems, Exception">" callback)
{
DataItems item = null;
Exception exc = null;
var dtable = new DataTable();
const string conectionString = @"DATA SOURCE=DEBRIS;PERSIST SECURITY INFO=True;
USER ID=OPER;PASSWORD=oper";
const string queryString = @"SELECT * FROM STAR.VEC_CAT WHERE (ID_KO = 23024)
ORDER BY DWRD DESC";
try
{
using (var ocon = new OracleConnection(conectionString))
{
var orcCommand = new OracleCommand(queryString, ocon);
ocon.Open();
dtable.Load(orcCommand.ExecuteReader());
if (dtable.DefaultView != null) item = new DataItems(dtable.DefaultView);
}
}
catch (Exception ex)
{
exc = new Exception(ex.Message);
}
finally
{
callback(item, exc);
}
}
Этот вариант оказался вполне приемлемым, все запросы отрабатывались корректно, однако в Microsoft, к моему сожалению, обозвали этот подход deprecated , и посоветовали использовать Oracle Developer Tolls for Visual Studio.Способ третий (конечный):
- в ODBC Administrator ничего делать не надо;
- скачиваем Oracle Developer Tolls for Visual Studio (ODT);
- устанавливаем это все согласно мануалу;
- соединяемся с базой данных через ODP.NET
Вроде бы все в теории просто, однако на практике есть некоторые особенности: вместе с ODT ставится клиент oracle, от установки которого невозможно отказаться (ну или можно, если клиент у вас той же версии, но я это не проверял), на Visual Studio 2012 ставился 11-й клиент oracle и ни грамма меньше.
После всей установки дополнительного софта, для доступа к БД не нужно ничего менять из предыдущего кода:
После всей установки дополнительного софта, для доступа к БД не нужно ничего менять из предыдущего кода:
using Oracle.DataAccess.Client;
public void GetData(Action"<"DataItems, Exception">" callback)
{
DataItems item = null;
Exception exc = null;
var dtable = new DataTable();
const string conectionString = @"DATA SOURCE=DEBRIS;PERSIST SECURITY INFO=True;
USER ID=OPER;PASSWORD=oper";
const string queryString = @"SELECT * FROM STAR.VEC_CAT WHERE (ID_KO = 23024)
ORDER BY DWRD DESC";
try
{
using (var ocon = new OracleConnection(conectionString))
{
var orcCommand = new OracleCommand(queryString, ocon);
ocon.Open();
dtable.Load(orcCommand.ExecuteReader());
if (dtable.DefaultView != null) item = new DataItems(dtable.DefaultView);
}
}
catch (Exception ex)
{
exc = new Exception(ex.Message);
}
finally
{
callback(item, exc);
}
}
кроме первой строки. И еще необходимо скопировать библиотеку Oracle.Data.dll из папки odp.net клиента Oracle в папку bin своего проекта. Это безусловно является большим плюсом. Но вот неожиданностью для меня стало то, что все мои предыдущие программы, которые так или иначе взаимодействовали с БД Oracle, перестали работать. Проблема оказалась в том, что oracle клиент не поддерживал русский язык, но проблема эта решается прописыванием в реестре переменной NLS_LANG (т.е. эту переменную из 10-го клиента необходимо прописать в 11-м).
После этих манипуляций все замечательно заработало. Следует отметить, что для настройки работы SQL Server-а времени у меня ушло намного меньше.
Большое спасибо, воспользовался описанной Вами схемой - все работает!
ОтветитьУдалитьСпасибо за комментарий!
УдалитьА у меня почему-то после установки ODT Visual Studio никак не видит Oracle.DataAccess.Client, и в папке bin нашла только
ОтветитьУдалитьOracle.DataAccess.dll
Oracle.DataAccess.Resources.dll
Oracle.Database.Extensions.dll