Имя: Пароль:
1C
 
[ODBC SQL Server Driver] Дополнительная возможность не реализована
0 solaru
 
14.06.06
15:25
При выполнени команды

Microsoft OLE DB Provider for ODBC Drivers: [Microsoft][ODBC SQL Server Driver]Дополнительная возможность не реализована

Это о чём может быть?
1 ТелепатБот
 
гуру
14.06.06
15:25
2 mikecool
 
14.06.06
15:28
(0) какой команды?
3 solaru
 
14.06.06
15:29
Cmd = СоздптьОбъект("ADODB.Command");

Rs = CreateObject("ADODB.RecordSet");

-> Rs = Cmd.Execute;
4 mikecool
 
14.06.06
15:31
(3) ни разу такого не видел... может проблема с АДО?
5 solaru
 
14.06.06
15:33
выложи кусочек кода вызова сторед процедуры и обхода РС
6 jbond
 
14.06.06
15:50
2(0) - понял, на что ТелепатБот намекнул?
7 solaru
 
14.06.06
15:51
Это не то!
8 vde69
 
14.06.06
15:54
код в студию
9 solaru
 
14.06.06
16:02
Как это сделать (ADO)

1. Создать объект ADODB.Connection

Соединение = СоздатьОбъект("ADODB.Connection");
ConnectionString = "driver={SQL Server}; server=myserver; uid=mylogin; pwd= myPasword; Database = myDatabase";
Соединение.ConnectionTimeOut =600;
Соединение.CursorLocation = 3;
Попытка  
Соединение.Open(ConnectionString);
Исключение
Предупреждение("Невозможно установить соединение");
КонецПопытки;

У меня это реализовано в глобальном модуле (при начале работы системы автоматически устанавливается соединение и существует, пока открыт сеанс 1С). Уничтожение объекта после окончания работы не требуется.

2. Формирование и отправка команды дла SQL-сервера.

Для формирования и отправки команды серверу необходимо создать объект ADODB.Command и связать его с текущим соединением.

Cmd = СоздатьОбъект("ADODB.Command");
Cmd.ActiveConnection = Соединение;

Для задания команды используется свойство CommandText:
Cmd.CommandText = текст_команды;

Текстом команды может быть оператор Т-SQL (SELECT, INSERT, UPDATE, DELETE и т.д), или имя хранимой процедуры из той базы данных, с которой установлено соединение. Пример:

Cmd.CommandText = "SELECT * FROM _1SACCS";  //Оператор Т-SQL
Cmd.CommandText = "my_stored_proc";  //Хранимая процедура

Для ускорения работы можно указать экземпляру объекта ADODB.Command тип команды, которая будет выполняться. Для этого я использую функцию ТипКомандыАдо():

Функция ТипКомандыАДО( АдоКонст ) Экспорт
АдоКонст = Нрег(АдоКонст);
Если АдоКонст = тогда возврат 1; //для оператора T-SQL
ИначеЕсли АдоКонст = Тогда возврат 2;
ИначеЕсли АдоКонст = Тогда возврат 4; //для хранимой процедуры
Иначе Возврат 8; //adcmdunknown
КонецЕсли;
КонецФункции

По умолчанию при создании экземпляра AdoDB.Command устанавливается тип adCmdUnknown (8).

Пример:

cmd.CommandType = ТипКомандыАДО("adCmdStoredProc");

Существенного ускорения работы при указании типа команды я не заметил, но всегда указываю его, считая это правилом хорошего тона.

Если используется хранимая процедура с параметрами, тогда необходимо добавить их в коллекцию Parameters объекта ADODB.Command:

Параметры создаются с помощью функции CreateParameter объекта ADODB.Command

CreateParameter (Name, Value_Type, Param_type, Param_Value)
Где Name - имя параметра. Как оно указано в хранимой процедуре
Value_Type - тип значения параметра
Param_Type - тип параметра (Input или Output)
Param_Value - собственно значение

Для определения типа значения параметра и типа параметра я использую функции КонстантаАДО() и ТипПараметраАДО() соответственно, прописанные в глобальный модуль:

Функция КонстантаАДО( Конст )  Экспорт
АдоКонст = НРег(Конст);
Если АдоКонст = "adEmpty" Тогда Возврат 0;
ИначеЕсли АдоКонст = "adtinyint" Тогда Возврат 16;
ИначеЕсли АдоКонст = "adsmallint" Тогда Возврат 2;
ИначеЕсли АдоКонст = "adinteger" Тогда Возврат 3;
ИначеЕсли АдоКонст = "adbigint" Тогда Возврат 20;
ИначеЕсли АдоКонст = "adunsignedtinyint" Тогда Возврат   17;
ИначеЕсли АдоКонст = "adunsignedsmallint" Тогда Возврат  18;
ИначеЕсли АдоКонст = "adunsignedint" Тогда Возврат 19;
ИначеЕсли АдоКонст = "adunsignedbigint" Тогда Возврат   21;
ИначеЕсли АдоКонст = "adsingle" тогда Возврат 4;
иначеесли АдоКонст = "addouble" тогда Возврат 5;
иначеесли АдоКонст = "adcurrency" тогда Возврат 6;
иначеесли АдоКонст = "addecimal" тогда Возврат 14;
иначеесли АдоКонст = "adnumeric" тогда Возврат 131;
иначеесли АдоКонст = "adboolean" тогда Возврат 11;
иначеесли АдоКонст = "aderror" тогда Возврат 10;
иначеесли АдоКонст = "aduserdefined" тогда Возврат 132;
иначеесли АдоКонст = "advariant" тогда Возврат 12;
иначеесли АдоКонст = "adidispatch" тогда Возврат 9;
иначеесли АдоКонст = "adiunknown" тогда Возврат 13;
иначеесли АдоКонст = "adguid" тогда Возврат 72;
иначеесли АдоКонст = "addate" тогда Возврат 7;
иначеесли АдоКонст = "addbdate" тогда Возврат 133;
иначеесли АдоКонст = "addbtime" тогда Возврат 134;
иначеесли АдоКонст = "addbtimestamp" тогда Возврат 135;
иначеесли АдоКонст = "adbstr" тогда Возврат 8;
иначеесли АдоКонст = "adchar" тогда Возврат 129;
иначеесли АдоКонст = "advarchar" тогда Возврат 200;
иначеесли АдоКонст = "adlongvarchar" тогда Возврат 201;
иначеесли АдоКонст = "adwchar" тогда Возврат 130;
иначеесли АдоКонст = "advarwchar" тогда Возврат 202;
иначеесли АдоКонст = "adlongvarwchar" тогда Возврат 203;
иначеесли АдоКонст = "adbinary" тогда Возврат 128;
иначеесли АдоКонст = "advarbinary" тогда Возврат 204;
иначеесли АдоКонст = "adlongvarbinary" тогда Возврат   205;
иначе Возврат 0;
КонецЕсли;
КонецФункции

Функция ТипПараметраАДО( Конст ) Экспорт
АдоКонст = НРег(Конст);
Если АдоКонст = "adparamunknown" тогда Возврат 0;    
иначеесли АдоКонст = "adparaminput"тогда Возврат 1;
иначеесли АдоКонст = "adparamoutput"тогда Возврат 2;
иначеесли АдоКонст = "adparaminputoutput"тогда Возврат  3;
иначеесли АдоКонст = "adparamreturnvalue"тогда Возврат  4;
КонецЕсли;                                          
КонецФункции

Пример:

prm1 = Cmd.CreateParameter("ID", КонстантаАДО("adWChar"),
ТипПараметраАДО("adParamInput"), 9, Код);
Cmd.Parameters.Append( prm1 );
Prm2 = Cmd.CreateParameter("OUTID", КонстантаАДО("adWChar"),
ТипПараметраАДО("adParamOutpt"), 9, Код);
Cmd.Parameters.Append( prm2 );

Для передачи параметров в хранимую процедуру необходимо описать все параметры в том  порядке и с теми типами, как они описаны в хранимой процедуре.

Реально я использовал передачу и возврат параметров типа AdChar, AdWChar (строковые), AdDate (дата), AdInteger, AdTinyInt ( целочисленные).  Параметры типа Numeric приходилось передавать, конвертируя их в строки.

3. Получение и обработка результатов

Результаты можно получать следующими путями:
- набор данных возвращается функцией Execute объекта ADODB.Command
- отдельные значения можно передавать из хранимой процедуры через параметры типа OUTPUT.

Пример:

Rs = CreateObject("ADODB.RecordSet");
Rs = Cmd.Execute; //Выполнение и получение набора данных
ВыхПарам = Cmd.Parameters(1).Value; //чтение параметра типа OUTPUT после выполнения.

- Нумерация параметров внутри коллекции Parameters начинается с 0 !!!
- Подготовленные 1 раз параметры можно использовать повторно, присваивая им значение через свойство Value.

Результирующий набор записей может обрабатываться в цикле с начала до конца, обращаясь к полям по их именам. В наборе записей не должны присутствовать поля типа Numeric - их необходимо преобразовывать в строковые непосредственно внутри SELECT или хранимой процедуры.

Пример:

Rs.MoveFirst();                
Пока Rs.EOF() = 0 do
Value1 = Rs.Fields("FieldName1").Value;
Value2 = Rs.Fields("FieldName2").Value;
Rs.MoveNext();
КонецЦикла;

После того, как набор записей уже не нужен, его нужно закрыть:

Rs.Close();

Когда я использую методы ADO для получения набора записей , в один из выходных параметров процедуры я помещаю результат работы функции @@ROWCOUNT. Так я контролирую, возвращен пустой набор записей, или нет.
10 vde69
 
14.06.06
16:05
так где у тебя траблы вылазят?  или уже разобрался и помощь не нужна??
11 solaru
 
14.06.06
16:07
Rs = CreateObject("ADODB.RecordSet");
Rs = Cmd.Execute; //Выполнение и получение набора данных

Вот тут! не работает!
12 vde69
 
14.06.06
16:10
чему равены:

Cmd.CommandType
Cmd.CommandText

на момент выполнения
13 vde69
 
14.06.06
16:13
кроме того с параметрами надо не так, они возвращаються ОТДЕЛЬНО. а возвращаеться таблица (или результат последнего оператора XP)

примерно так

   Try
       Set=Command.Execute();
   Except
       Предупреждение(ОписаниеОшибки());
       Возврат -1;
   EndTry;            
               
   Если (Set.EOF() = -1)и(UpdateStatus=2)  тогда
       Возврат 1;
   ИначеЕсли (Set.EOF() = -1)и(UpdateStatus < 2)  тогда
       UpdateStatus=0;
   ИначеЕсли (Set.EOF() <> -1)и(UpdateStatus < 2)  тогда
       UpdateStatus=1;
   КонецЕсли;
14 vde69
 
14.06.06
16:15
вот так ХП вызываеться


   rs = Command.CreateParameter("SourceHref",        200,    1, 128, SourceHref);
   Command.Parameters.Append(rs);    
   
//@ImageURL varchar(128) = ''
   rs = Command.CreateParameter("ImageURL",        200,    1, 128, ImageURL);
   Command.Parameters.Append(rs);

   Command.CommandText="UpdateNewsData";

   Try
       Set=Command.Execute();
   Except
       Предупреждение(ОписаниеОшибки());
       Возврат -1;
   EndTry;
AdBlock убивает бесплатный контент. 1Сергей