Имя: Пароль:
1C
 
Как подключиться к БД Oracle?
0 gar_den
 
19.01.09
13:56
Есть БД на Oracle. имеется имя ODBC источника и пользователь с паролем. Нужно как-то подключиться к БД и достать инфу из таблиц. Как это сделать?
1 Дуб
 
19.01.09
13:57
2 Дуб
 
19.01.09
13:57
+(1) а дальше - вопрос топологии БД
3 Дуб
 
19.01.09
13:58
Я в своё время из Оракула данные тягал в 1С. Таблицы мне называли прогеры, которые Оракула сопровождали.
4 чупа
 
19.01.09
14:01
чувак, у меня регулярный обмен в обе стороны с ораклом
щас у меня ночь почти
давай свой контакт, завтра вышлю тебе процедуры, если тему эту увижу
5 gar_den
 
19.01.09
14:03
(4) Буду безмерно признателен!)) gar_den@rambler.ru, можно в аську 244417690
6 gar_den
 
19.01.09
14:05
а у меня щас 15.00, вот дали букмажку как раз с топологией БД и впуть! ща нада как-нить 3 часика отвоевать)))
7 Дуб
 
19.01.09
14:08
(6) так что мешает? Дерзай!
8 gar_den
 
19.01.09
15:26
отвлекли...
9 gar_den
 
19.01.09
16:09
вобщем пишу вот так:
DataBaseConnection = Новый COMObject("ADODB.Connection");
DataBaseConnection.ConnectionString = "Provider=OraOLEDB.Oracle;Data Source=itgas;User Id=C1;Password=system1c;";
DataBaseConnection.Open();

В итоге ошибка: Ошибка при вызове метода контекста (Open): Произошла исключительная ситуация (ADODB.Connection): Не удается найти указанного поставщика. Вероятно, он установлен неправильно.
   DataBaseConnection.Open();
10 ДенисЧ
 
19.01.09
16:09
Драйвер оракля установлен?
11 Дуб
 
19.01.09
16:11
(10) ты сначала спроси: знает ли автор, где это посмотреть..
12 ДенисЧ
 
19.01.09
16:11
(11) Он сам сейчас это спросит :-0
13 gar_den
 
19.01.09
16:58
(10,11,12) а где это посмотреть?
14 gar_den
 
19.01.09
16:59
(13) внатуре!
15 ДенисЧ
 
19.01.09
17:00
(144) В апплете ODBC панели управления. А ещё, если ты его специально не ставил, то его скорее всего нет.
Или обратись к DBA, или сходи на сайт оракля.
16 dk
 
19.01.09
17:22
(13) создаешь файл 1.udl и запускаешь, потом ищешь в списке поставщиков данных
если вдруг он там есть:
установи все параметры, и потом блокнотом посмотри этот файлик - можешь сильно удивиться :)
17 AquaKosh
 
19.01.09
17:47
18 чупа
 
20.01.09
02:58
Итак, можно через ADO, как тут уже советовали,
можно через Oracle Client, что на мой взгляд предпочтительнее
делается так:

MySession = CreateObject("OracleInProcServer.XOraSession");
Base = MySession.OpenDatabase(SID, Login + "/" + Password, 0);

// затем,
// если нужен запуск хранимой процедуры, то
Base.ExecuteSQL("begin export_1c; end;");

// если нужен возврат курсора (рез-т запроса) то
Clients = Base.CreateDynaset("select * from clients",0);
Пока Clients.EOF = 0 Цикл
 сообщить(Clients.Fields("CLIENT_ID").Value);
 Clients.MoveNext();
КонецЦикла;
19 su_mai
 
20.01.09
06:38
(18) Уважаемый Чупа. У меня аналогичная ситуация! Плиз хелп и ми... кинте на мыло процедурки...
20 чупа
 
20.01.09
06:48
(19) так все же в (18)
какие-то вопросы остаются?
21 su_mai
 
20.01.09
07:07
(20) Пока нет, но в процессе появятся. Спасибо!
22 gar_den
 
20.01.09
14:06
Работаю через ADO
(через Oracle Client не получилось)
подключаюсь, достаю данные, только вот они в кракозябрах выходят. Как-то кодировку надо установить, а как? кто-нибудь знает?
23 bazvan
 
20.01.09
14:11
НА ИТС есть обработка подключения к БД там вроде и Оракл есть
24 чупа
 
20.01.09
14:29
(22) клиент на машине установлен?
25 чупа
 
20.01.09
14:30
сделай tnsping <SID базы>
26 gar_den
 
20.01.09
14:40
(24) да, подключение же проходит, и данные вытаскивает
27 Дуб
 
20.01.09
14:56
(22) попробуй другой драйвер. По крайней мере, при работе с *.dbf семёрки читать кириллицу можно не любым драйвером..
28 чупа
 
20.01.09
15:00
(26) да действительно...
У меня через клиент не получалось пока не делал установку в режиме Administrator (там еще стандарт и кастом кажится).
Он без этого ком-объект OracleInProcServer не регистрировал.


кодировка выставляется в реестре
(щас не могу посмотреть)
по памяти
local_machine\oracle\home0\
параметр nls_lang.
он состоит из 3 частей
1_2.3, у тебя например russian_cis.win1252
1-й язык, 2-й территория, 3й кодовая страница
кажется так

тебе нужен 3-й
бывает требуется с 866 менять на 1252 и наоборот
29 gar_den
 
20.01.09
15:37
в реестре ничего нельзя менять - ITшники шипко против
30 чупа
 
21.01.09
00:36
(29) скорее всего вы друг друга не поняли.
кодовая страница на клиенте устанавливается в реестре.

на сервере есть своя кодовая страница, она в сервере оракл установлена.
например, 1252 или юникод
сервер передает данные клиенту в этой кодировке, на клиенте стоит тоже кодовая страница, она устанавливается в реестре (если клиент на виндовсе),
тут уже может быть кодовая страница, например, 866
будет проходить трансляция из одной в другую кодировки.

вообщем, если надо меня кодовыую страницу то именно в реестре.

посмотри какая у тебя стоит?
какая будет там, для кого ты делаешь разработку?
31 gar_den
 
22.01.09
10:30
разобрался с кодировкой. теперь вопрос с вызовом хранимой процедуры:

DataBaseConnection = Новый COMObject("ADODB.Connection");
Кодировка = "windows-1251";
DataBaseConnection.ConnectionString = "Provider=MSDASQL.1;Password=" + Password + ";Persist Security Info=True;CharSet=" + Кодировка + ";User ID=" + Login + ";Data Source=" + DataSourse;
DataBaseConnection.Open();

RecordSet = Новый COMObject("ADODB.Recordset");
RecordSet.ActiveConnection = DataBaseConnection;

RecordSet.Open("SELECT * FROM " + Table + " WHERE " + TrimALL(Uslovie));
   
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = DataBaseConnection;
Command.CommandType = 4; //"adCmdStoredProc" (вызов хранимой процедуры);

НаборЗаписей = Новый COMОбъект("ADODB.Recordset");

While NOT RecordSet.EOF Do
       
   Command.CommandText = "itg.get_prices('АСПЭК', 1, 1, '2008-09-22')";
   Command.Execute();
   НаборЗаписей.Open(Command);
       НаборЗаписей.MoveFirst();

       RecordSet.MoveNext();
       
EndDo;

На строке НаборЗаписей.MoveFirst(); выдается ошибка:
Ошибка при вызове метода контекста (MoveFirst): Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.
32 ДенисЧ
 
22.01.09
10:33
В каком виде itg.get_prices возвращает результаты?
33 gar_den
 
22.01.09
11:14
(32) число
34 ДенисЧ
 
22.01.09
11:16
НаборЗаписей = Command.Execute()
?
35 gar_den
 
22.01.09
11:22
все получилось. сделал по-другому:
RecordPrice = DataBaseConnection.Execute("SELECT itg.get_prices('БелкамнефтьПТ(НПУ-2)', 2, 3, '2008-12-12') FROM " + Table);
       Price = 0;
       If RecordPrice.Fields.Count > 0 Then
           Price = RecordPrice.Fields[0].Value;
       EndIf;
2 + 2 = 3.9999999999999999999999999999999...