Имя: Пароль:
1C
1С v8
v8.3 x64 подключение к бд Oracle не работает классический прием
0 mimary
 
10.07.17
12:09
Добрый день, хотим мигрировать на 1c x64. Обнаружилась проблема.

1c 8.3.9.2170 x64 на скл
клент Oracle 12.2.0 x64
win 2012 x64

Нормально создаются и работают объекты  Connection и RecordSet.

ConnectString  ="Provider=OraOLEDB.Oracle;Data Source=TEST;User Id=ххх;Password=хххх;";
objCon = Новый COMОбъект("ADODB.Connection");
objCon.ConnectionString = ConnectString;
objCon.Open();
RecordSet = Новый COMОбъект("ADODB.RecordSet");
RecordSet = objCon.Execute("SEleCT * FROM ussd_bis.db_sells_events");

При попытке подсунуть этот коннект в свойство ActiveConnection для объекта  Command выдает ошибку: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

ConnectString  ="Provider=OraOLEDB.Oracle.1;Data Source=TEST;User Id=ххх;Password=хххх;";
objCon = Новый COMОбъект("ADODB.Connection");
objCon.ConnectionString = ConnectString;
objCon.Open();
objCmd  = Новый COMОбъект("ADODB.Command");
objCmd.ActiveConnection = objCon;


пробовала варианты
ConnectString  ="Provider=MSDASQL.1 ..."
objCmd.ActiveConnection = ConnectString;
такая же история.

Может кто подскажет - где искать проблему.
1 МихаилМ
 
10.07.17
12:36
перепишите без ActiveConnection
2 mimary
 
10.07.17
12:55
спасибо, но переписать на Connection не получится. надо выполнять запросы с параметрами. Если постоянно склеивать строку с запросом, ругаются что кэш забивается. и еще надо процедуру с параметрами вызывать.
3 МихаилМ
 
10.07.17
13:14
опишите задачу развернуто, что бы Вам не предлагали
уже испробованные варианты
4 mexanik_96
 
10.07.17
13:25
(0) используйте внешние источники(драйвера odbc)
5 mimary
 
10.07.17
13:40
пробовала драйвер odbc: ConnectString   =  "DRIVER={Oracle in OraClient12home1};UID=xxx;PWD=xxxx;DBQ=TEST"; провайдер цепляется MSDASQL.1. Результат аналогичный. 2 объекта работают, третий - нет. Может в этом случае делаю что то не так...
6 mimary
 
10.07.17
13:44
все работает на 8.2 x32.
Код был такой: objCmd= Новый COMОбъект("ADODB.Command");
objCon= Новый ComОбъект("ADODB.Connection");

СтрокаСоединения =  "Provider=MSDAORA.1;Password="+ПарольАдминистратора+";User ID="+ИмяАдминистратора+";Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST="+СтрокаСоединенияCервер+")(PORT = 1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME="+ИмяБазы+")));Persist Security Info=False;";
objCon.ConnectionString = СтрокаСоединения;
objConL.Open();
Command.ActiveConnection = objCon;
        
TextЗапроса = "select count(1) from ss s
    | where s.id_promr = ?";
                          
objCmd.CommandText = TextЗапроса;
objCmd.Parameters.Append(Command.CreateParameter("id_prom",14,3,,ID));
        
RecordSet = Новый COMОбъект("ADODB.RecordSet");
RecordSet = objCmd.Execute();
        
Пока RecordSet.EOF()=Ложь Цикл
    ...    RecordSet.MoveNext();
КонецЦикла;
RecordSet.Close();
extConnSQL.Close();

//---------------------------------------------------------------------------------------------------
или вызов процедуры

objCmd.CommandText ="имя процедуры";
П1 = Command.CreateParameter("id_prom", adInteger, adParamInput, 5, Число(id_prom));
Command.Parameters.Append(П1);
Command.Execute();

Для 8.3 х64 поменяла только драйвер на OraOLEDB.Oracle х64
7 МихаилМ
 
10.07.17
13:46
попробуйте указать

"OraOLEDB.Oracle.1"  без "
.1"
8 mimary
 
10.07.17
14:22
с ".1" или без, все равно objCon.Provider    "OraOLEDB.Oracle.1" подставляет. по отладчику видно
9 mexanik_96
 
10.07.17
14:24
"Результат аналогичный. 2 объекта работают, третий - нет. Может в этом случае делаю что то не так..." дак там запросом же, вот прям в 1с запросом попробуйте (запросом к внешнему источнику данных) все там должно работать
10 mexanik_96
 
10.07.17
14:26
+(9) в конфе добавить внешний источник данных(объект конфигурации). обратится к нему запросом. может так понятно будет
11 mimary
 
10.07.17
14:36
ну помимо запроса есть еще вызовы процедур с параметрами:

objCmd.CommandText ="имя процедуры";
П1 = Command.CreateParameter("id_prom", adInteger, adParamInput, 5, Число(id_prom));
Command.Parameters.Append(П1);
Command.Execute();

в этом случае внешний источник данных разве спасет?
12 mexanik_96
 
10.07.17
17:10
+(11) да
13 mimary
 
11.07.17
09:07
спасибо, попробую
14 mimary
 
11.07.17
13:39
mexanik_96 спасибо. так все работает
Кaк может человек ожидaть, что его мольбaм о снисхождении ответит тот, кто превыше, когдa сaм он откaзывaет в милосердии тем, кто ниже его? Петр Трубецкой