|
[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; |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |