Имя: Пароль:
1C
1С v8
ADODB.Recordset
0 Gisborn
 
16.11.12
16:29
Есть
Подключение = Новый ComObject("ADODB.Connection");
Подключается, все в порядке.

ТекстЗапроса = "INSERT INTO Threads (ThreadTypeID,ThreadDescr,OperatorLoginCreated)
|VALUES ('что-то','что-то','что-то')
|DECLARE @LastId as int
|SELECT @LastID = SCOPE_IDENTITY() FROM Threads
|INSERT INTO Msgs (ThreadId, OperatorLogin, MsgText) values (@LastId,'operator','msg')
|SELECT @LastID as LastID

КомандаSQL = Новый COMObject("ADODB.Command");
КомандаSQL.ActiveConnection = Подключение;
КомандаSQL.NamedParameters = True;    
КомандаSQL.CommandType = 1;
КомандаSQL.Prepared = Истина;
КомандаSQL.CommandText = ТекстЗапроса;
   
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");    
ЗаписиSQL = КомандаSQL.Execute();

Данные = ЗаписиSQL.GetRows().Выгрузить();    

Т.е. мне нужно вставить запись в одну таблицу, получить ее ID, и с этим ID вставить запись в связанную таблицу. После этого вернуть этот самый ID в 1с.

Запрос отрабатывает, записи в базу SQL попадают. Возвратить  LastID не получается.
Ошибка при вызове метода контекста (GetRows)
   Данные = ЗаписиSQL.GetRows().Выгрузить();    
по причине:
Произошла исключительная ситуация (ADODB.Recordset): Операция не допускается, если объект закрыт.

Помогите разобраться, пожалуйста.
1 ДенисЧ
 
16.11.12
16:32
Поппробуй так
ТекстЗапроса = "
|SET NOCOUNT ON
|INSERT INTO Threads (ThreadTypeID,ThreadDescr,OperatorLoginCreated)
|VALUES ('что-то','что-то','что-то')
|DECLARE @LastId as int
|SELECT @LastID = SCOPE_IDENTITY() FROM Threads
|INSERT INTO Msgs (ThreadId, OperatorLogin, MsgText) values (@LastId,'operator','msg')
|SELECT @LastID as LastID

КомандаSQL = Новый COMObject("ADODB.Command");
КомандаSQL.ActiveConnection = Подключение;
КомандаSQL.NamedParameters = True;    
КомандаSQL.CommandType = 1;
КомандаSQL.Prepared = Истина;
КомандаSQL.CommandText = ТекстЗапроса;
   
ЗаписиSQL = Новый ComObject("ADODB.RecordSet");    
ЗаписиSQL = КомандаSQL.Execute();
ЗаписиSQL = ЗаписиSQL.NextRecordset();
2 Gisborn
 
16.11.12
16:36
тут ЗаписиSQL = ЗаписиSQL.NextRecordset();
ЗаписиSQL становятся равными Неопределено
3 Gisborn
 
16.11.12
16:39
Поменял SELECT @LastID as LastID
на
SELECT TOP 1 @LastId as LastId FROM Threads

GetRows перестал падать, значение возвращается.
Наверно неправильно, но работает.
4 Serginio1
 
16.11.12
17:02
Так у тебя возвращается несколько @LastID

|SELECT @LastID = SCOPE_IDENTITY() FROM Threads
|INSERT INTO Msgs (ThreadId, OperatorLogin, MsgText) values (@LastId,'operator','msg')
|SELECT @LastID as LastID


Кстати выбирает множество запросов

РекордСет=Command.Execute();

Резулт="";
Пока РекордСет<>неопределено Цикл
   Если РекордСет.Fields.Count>0 Тогда
       Поле=РекордСет.Fields(0);
       Стр=Поле.Name+" "+Поле.Value;
       Если ЗначениеЗаполнено(Резулт) тогда
           Резулт=Резулт+"
           |"+Стр
       иначе
           Резулт=Стр;
       КонецЕсли;
   КонецЕсли;
   РекордСет=РекордСет.NextRecordSet();
КонецЦикла;