Имя: Пароль:
1C
 
v8: Запуск хранимых процедур с 1с 8.1
0 Renat11111
 
19.11.09
17:47
Добрый день. Возник такой вопрос. Надо программно из 1с подключиться к базе данных СКЛ2005, запустить хранимую процедуру, которая добавит что-то в таблицу.
Допустим есть база "Test", в ней есть таблица Table_1 с одной колонкой Col1.
Есть хранимая процедура, например InsertData, которая добавляет строку в таблицу.

Есть следующий код:
   
DataBaseConnection = Новый COMObject("ADODB.Connection");
DataBaseConnection.ConnectionString = "Driver={SQL Server}; Password='111'; User ID = 'sa'; Data Source = MSDASQL.1; SERVER=server";
DataBaseConnection.Open();
   
Command = Новый COMОбъект("ADODB.Command");
Command.ActiveConnection = DataBaseConnection;

par = Command.CreateParameter("@param1",3,1,4,0);
Command.parameters.append(par);

Command.CommandText = "InsertData";
Command.Parameters(0).Value=777;

sp = Command.Execute();

Проблема состоит в следующем: процедура запускается, но добавляет пустую строчку в таблицу. Я так понимаю неправильно заполняю или передаю параметр.
Подскажите плиз что не так делаю.
П.С. Сама процедура рабочая, так как если запускать ее в менеджмент студио, нормально добавляет значение в таблицу
1 mselling_ru
 
19.11.09
17:50
Command.CommandText = СтрокаЗапроса;
       RecordSet = Command.Execute();

строказапроса как в студии
2 Renat11111
 
19.11.09
17:53
InsertData это хранимая процедура, в которой прописан след. код:
 INSERT INTO Table_2(Col1) VALUES (@param1)
Пример дан упрощенный. Но почему-то в таком варианте записывает пустые строки в таблицу. Хотя при вызове из студио нормально добавляет значения
3 mselling_ru
 
19.11.09
17:54
Connection = Новый COMОбъект("ADODB.Connection");
   Command = Новый COMОбъект("ADODB.Command");
   RecordSet = Новый COMОбъект("ADODB.RecordSet");
   
   Попытка
       
       Connection.ConnectionString = "driver={SQL Server};server=" + Сервер + ";uid=;pwd=;database=" + База + "";
       Connection.Open();
       Command.ActiveConnection = Connection;
       
       Возврат 1;
   Исключение
       ДобавитьЗаписьВЛог("Не удалось установить соединение с SQL Server'ом.");
       Возврат 0;
   КонецПопытки;    

Попытка
       
       СтрокаЗапроса = Лев(СтрокаЗапроса, СтрДлина(СтрокаЗапроса) - 1);
       
       Command.CommandText = СтрокаЗапроса;
       RecordSet = Command.Execute();
       
   Исключение
       ДобавитьЗаписьВЛог("Ошибка выполнения " + ИмяПроцедуры + ". Строка запроса + " + СтрокаЗапроса + " . Описание ошибки: " + ОписаниеОшибки());
   КонецПопытки;
4 Renat11111
 
19.11.09
17:57
Да нету никаких ошибок. Коннект с базой идет, процедура вызывается, но вместо переданного значения добавляет 0!
5 shuhard
 
19.11.09
18:01
(4)[par = Command.CreateParameter("@param1",3,1,4,0);]
типы данных соответствуют 777 ?
6 Renat11111
 
19.11.09
18:03
Все соответствует.

CreateParameter(Name, Type, Direction, Size, Value)

Тип параметра (Type) 3 - это integer

Взято из MSDN:
adEmpty(0) - значение не задано.
adSmallInt(2) - двухбайтное целое со знаком.
adInteger(3) - четырёхбайтное целое со знаком.
adSingle(4) - число с плавающей запятой с одинарной точностью.
adDouble(5) - число с плавающей запятой с двойной точностью.
adCurrency(6) - денежная сумма с фиксированной точкой с четырьмя цифрами справа от десятичной точки (восьмибайтное целое число со знаком).
...
...
7 mselling_ru
 
19.11.09
18:04
(5) не мешай человеку через ж..опу делать.
8 shuhard
 
19.11.09
18:04
(5) + может в лоб сделать, а'ля MSDN
Set objParm1 = objCmd.CreateParameter("CustId", adChar, _
                   adParamInput, 5, "ALFKI")
   objCmd.Parameters.Append objParm1

par = Command.CreateParameter("@param1",3,1,4,0);
9 shuhard
 
19.11.09
18:05
(6) поставь для проверки
par = Command.CreateParameter("@param1",3,1,4,777)
10 Renat11111
 
19.11.09
18:06
mselling_ru
(5) не мешай человеку через ж..опу делать.

объясни плиз что тут через ж..опу????


(6) поставь для проверки

Не помогает...
11 mselling_ru
 
19.11.09
18:07
(10) у кого ж..опа у тебя или у меня? что за вопросы?
12 shuhard
 
19.11.09
18:08
(10) т.е. код стал ?
par = Command.CreateParameter("@param1",3,1,4,777);
Command.parameters.append(par);
Command.CommandText = "InsertData";
sp = Command.Execute();
13 Renat11111
 
19.11.09
18:09
(10) у кого ж..опа у тебя или у меня? что за вопросы?

вполне нормальные вопросы.. Обычным текстом запроса параметры в хранимую процедуру ты не передашь!!!

ты или давай нормальные ответы или вообще ничего не пиши!
14 Renat11111
 
19.11.09
18:10
(10) т.е. код стал ?
par = Command.CreateParameter("@param1",3,1,4,777);
Command.parameters.append(par);
Command.CommandText = "InsertData";
sp = Command.Execute();



пробовал и так... тоже не помогает! Все-равно пишется 0 в таблицу
15 shuhard
 
19.11.09
18:13
(13)[Обычным текстом запроса параметры в хранимую процедуру ты не передашь]
давно было, вроде катит:
select InsertData (777)
должен работать, проверь в QA
16 AHgpuXa
 
19.11.09
18:24
Command.CommandType = 4;
..
sp = Command.open();
17 Renat11111
 
19.11.09
18:25
Проблема решена. Всем отозвавшимся спасибо.
Если кому интересно, проблема была в следующем:
при создании хранимой процедуры в параметры были записаны значения по умолчанию.
тоесть:

Create Procedure InsertData(@id numeric = 0 out, @param1 varchar(10) = '', @param2 numeric = 0)

и почему-то они не заменялись передаваемыми параметрами. Убрал значения по умолчанию, все заработало. Правда пока не понял почему.

Теперь еще один вопрос. Первый параметр выходной. Как мне получить его значение после выполнения процедуры. В самой процедуре он записывается. Что-то типа след. кода:
   INSERT INTO Table_1(Col1, Col2) VALUES (@param1, @param2)
   SET @id = 3

Когда пытаюсь получить его в выборке:

   Пока RecordSet.EOF() = 0 Цикл
       Парам = RecordSet.Fields("id").Value;
       Сообщить("Out параметр = "+Парам);
       RecordSet.MoveNext();
   КонецЦикла;
выдает след. ошибку:

Ошибка при вызове метода контекста (EOF): Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.
18 mselling_ru
 
19.11.09
18:48
(13) "Обычным текстом запроса параметры в хранимую процедуру ты не передашь!!! " - c какого перепугу? у меня на этом весь обмен построен, а я не знал :)
19 Renat11111
 
19.11.09
18:53
Ну напиши как мне в моем конкретном случае вызвать мою процедуру с передачей параметров. Дай текст запроса!
20 mselling_ru
 
19.11.09
18:55
с сайта скачай, там целых две обработки и для 77 и для 81.
21 Renat11111
 
19.11.09
18:56
ссылку дай. буду благодарен. только думаю что в моем конкретном случае это не подойдет
22 mselling_ru
 
19.11.09
18:58
упал под стол
23 Renat11111
 
19.11.09
19:00
падай дальше
24 Renat11111
 
19.11.09
19:02
Нормальные люди нормально отвечают на вопросы! В отличие от некоторых!
25 mselling_ru
 
19.11.09
19:04
с чего ты взял что ты нормальный? в Эстонии все такие сообразительные?
26 Renat11111
 
20.11.09
08:50
Ты знаешь, я вот тут сижу и думаю, зачем это тупые разработчики придумали передачу параметров, их типов, размера и т.д. Нефиг было им чем заняться?? Тут нашелся умный   mselling_ru и сказал: "Ребята, так вы ж все через ж..пу сделали. Так неправильно. У меня есть другой метод. Надо прямо в тексте запроса на скл параметры в процедуры передавать!!!".
Может ты им предложишь свою рационализаторскую идею???? Они ж фигню сделали, а ты у нас умный очень, решил что так через ж..пу!!!
27 lxs
 
21.11.09
09:52
отмечусь