Вход | Регистрация
 

v8: Запуск хранимых процедур с 1с 8.1

v8: Запуск хранимых процедур с 1с 8.1
Я
   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();

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

строказапроса как в студии
   Renat11111
 
2 - 19.11.09 - 17:53
InsertData это хранимая процедура, в которой прописан след. код:
 INSERT INTO Table_2(Col1) VALUES (@param1)
Пример дан упрощенный. Но почему-то в таком варианте записывает пустые строки в таблицу. Хотя при вызове из студио нормально добавляет значения
   mselling_ru
 
3 - 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();
        
    Исключение
        ДобавитьЗаписьВЛог("Ошибка выполнения " + ИмяПроцедуры + ". Строка запроса + " + СтрокаЗапроса + " . Описание ошибки: " + ОписаниеОшибки());
    КонецПопытки;
   Renat11111
 
4 - 19.11.09 - 17:57
Да нету никаких ошибок. Коннект с базой идет, процедура вызывается, но вместо переданного значения добавляет 0!
   shuhard
 
5 - 19.11.09 - 18:01
(4)[par = Command.CreateParameter("@param1",3,1,4,0);]
типы данных соответствуют 777 ?
   Renat11111
 
6 - 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) - денежная сумма с фиксированной точкой с четырьмя цифрами справа от десятичной точки (восьмибайтное целое число со знаком).
...
...
   mselling_ru
 
7 - 19.11.09 - 18:04
(5) не мешай человеку через ж..опу делать.
   shuhard
 
8 - 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);
   shuhard
 
9 - 19.11.09 - 18:05
(6) поставь для проверки 
par = Command.CreateParameter("@param1",3,1,4,777)
   Renat11111
 
10 - 19.11.09 - 18:06
mselling_ru
(5) не мешай человеку через ж..опу делать.

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


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

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

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

ты или давай нормальные ответы или вообще ничего не пиши!
   Renat11111
 
14 - 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 в таблицу
   shuhard
 
15 - 19.11.09 - 18:13
(13)[Обычным текстом запроса параметры в хранимую процедуру ты не передашь]
давно было, вроде катит:
select InsertData (777) 
должен работать, проверь в QA
   AHgpuXa
 
16 - 19.11.09 - 18:24
Command.CommandType = 4;
..
sp = Command.open();
   Renat11111
 
17 - 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): Операция не допускается, если объект закрыт.
   mselling_ru
 
18 - 19.11.09 - 18:48
(13) "Обычным текстом запроса параметры в хранимую процедуру ты не передашь!!! " - c какого перепугу? у меня на этом весь обмен построен, а я не знал :)
   Renat11111
 
19 - 19.11.09 - 18:53
Ну напиши как мне в моем конкретном случае вызвать мою процедуру с передачей параметров. Дай текст запроса!
   mselling_ru
 
20 - 19.11.09 - 18:55
с сайта скачай, там целых две обработки и для 77 и для 81.
   Renat11111
 
21 - 19.11.09 - 18:56
ссылку дай. буду благодарен. только думаю что в моем конкретном случае это не подойдет
   mselling_ru
 
22 - 19.11.09 - 18:58
упал под стол
   Renat11111
 
23 - 19.11.09 - 19:00
падай дальше
   Renat11111
 
24 - 19.11.09 - 19:02
Нормальные люди нормально отвечают на вопросы! В отличие от некоторых!
   mselling_ru
 
25 - 19.11.09 - 19:04
с чего ты взял что ты нормальный? в Эстонии все такие сообразительные?
   Renat11111
 
26 - 20.11.09 - 08:50
Ты знаешь, я вот тут сижу и думаю, зачем это тупые разработчики придумали передачу параметров, их типов, размера и т.д. Нефиг было им чем заняться?? Тут нашелся умный   mselling_ru и сказал: "Ребята, так вы ж все через ж..пу сделали. Так неправильно. У меня есть другой метод. Надо прямо в тексте запроса на скл параметры в процедуры передавать!!!".
Может ты им предложишь свою рационализаторскую идею???? Они ж фигню сделали, а ты у нас умный очень, решил что так через ж..пу!!!
   lxs
 
27 - 21.11.09 - 09:52
отмечусь


Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Ветка сдана в архив. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует