Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

Обновление набора записей ADODB, почему не срабатывает?

Обновление набора записей ADODB, почему не срабатывает?
Я
   seraf
 
21.08.20 - 10:17
Приветствую, почему у меня содержимое таблицы не апдейтится, где ошибка?

    Connection = ConnectSQL();
    Если Connection = Неопределено Тогда
        Сообщить("Не удалось установить соединение с базой данных!");
        Возврат Неопределено;
    КонецЕсли;

    CommandText = "select * from tbl1 where msgid = " + msgid_;
    Попытка
        rsRES = NEW COMObject("ADODB.Recordset");
        rsRES.CursorLocation = 3;
        rsRES.Open(CommandText, Connection, 2, 3);
        rsRES.Fields("Active").Value = 0;
        rsRES.Fields("UsrID").Value = Строка(ПолучитьУИДПольз());
        rsRES.Update();
    Исключение
        Сообщить("Ошибка обновления: "+ ОписаниеОшибки());
        Connection.Close();
        Возврат Неопределено;
    КонецПопытки;
   Ёпрст
 
1 - 21.08.20 - 10:26
а в каком месте апдейт  то ?
   Ёпрст
 
2 - 21.08.20 - 10:28
и.. какую запись ты этим кодом хочешь "проапдейтиить"?
   ДенисЧ
 
3 - 21.08.20 - 10:28
(1) @rsRES.Update();@
А эт что? Британская королева? (по мотивам анекдота)
   acht
 
4 - 21.08.20 - 10:28
(0)
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
   acht
 
5 - 21.08.20 - 10:29
Ну и CursorLocation = 3;  это adUseClient, что довольно странно
   acht
 
6 - 21.08.20 - 10:31
И присоединюс к (2) - какую строку ты обновляешь-то?
   Ёпрст
 
7 - 21.08.20 - 10:35
ну и проще тупо 
update tbl1
set Active=0, UsrID='"+ПолучитьУИДПольз()+"'
where msgid = " + msgid_;
   seraf
 
8 - 21.08.20 - 10:37
я обновить ожидал весь набор записей, апдейтом могу в принципе, но хотел еще через Recordset
не особо синтаксис этот знаю, по примерам смотрю
   NorthWind
 
9 - 21.08.20 - 10:39
(8) как весь? Вашим кодом вы обновите одну запись в обновляемом рекордсете.
   seraf
 
10 - 21.08.20 - 10:39
всю отобранную гранулу можно заапдейтить одинаковым значением?
или при переборе отдельные значения
    Пока НЕ rsRES.eof() Цикл
                rsRES.Fields("Active").Value = 0;
                rsRES.Fields("UsrID").Value = Строка(ПолучитьУИДПольз());
                rsRES.Update();
        rsRES.MoveNext();
    КонецЦикла;
   seraf
 
11 - 21.08.20 - 10:39
а какую моим кодом, одну первую что ли?
   NorthWind
 
12 - 21.08.20 - 10:40
(11) да
   NorthWind
 
13 - 21.08.20 - 10:40
(10) да, вот так надо делать
   NorthWind
 
14 - 21.08.20 - 10:41
только...  вы Edit забыли
   seraf
 
15 - 21.08.20 - 10:42
Только Update за пределы цикла наверное, да
(14) какой Edit
   NorthWind
 
16 - 21.08.20 - 10:42
перед тем как изменять поля, сделайте recordset.Edit ()
   NorthWind
 
17 - 21.08.20 - 10:43
а апдейт, по-моему, из цикла не надо убирать. Он на каждую запись работает. Хотя могу ошибаться, давно не делал, но по-моему, так.
   NorthWind
 
18 - 21.08.20 - 10:43
другое дело что если вы делаете мувнекст, он, по-моему, все равно неявно апдейтит запись
   seraf
 
19 - 21.08.20 - 10:45
ну поиграюсь, проверю, спасибо
а что дают 2,3 в rsRES.Open(CommandText, Connection, 2, 3);
без них рекордсет не хотел обновляться, взял из какого-то примера
и CursorLocation = 3;
   NorthWind
 
20 - 21.08.20 - 10:48
(6) по идее, если он не делает переходов по записям, то апдейтиться будет первая запись (после открытия) в обновляемом рекордсете.
Поскольку у него таблица одна и ключевая инфа явно присутствует (select *), то в общем-то нет никаких препятствий к тому чтобы ADO просралось и правильно поняло чего и как редактировать.
   acht
 
21 - 21.08.20 - 10:54
   NorthWind
 
22 - 21.08.20 - 10:57
(19) третий параметр - тип курсора. Курсор - это набор записей на сервере БД. Для скуля чаще всего используется Keyset (1). Вы поставили 2, это динамический, более ресурсоемкий.
Четвертый - тип блокировки. Если вы хотите править по одной записи и полагаете что никто кроме вас в это время трогать записи не будет, то проще всего юзать оптимистический, тогда записи блокируются только когда вызывается Update. Есть еще работа с пакетами записей (батч оптимистик), это отдельная тема, долго рассказывать. Если другие юзеры тоже ковыряют записи, можно пессимистический. Есть еще рид-онли, это значит необновляемый рекордсет будет
   NorthWind
 
23 - 21.08.20 - 10:57
3 - это и есть оптимистический
   seraf
 
24 - 21.08.20 - 13:39
спасибо
   NorthWind
 
25 - 21.08.20 - 16:41
если вы хотите групповое исправление одним значением, лучше адо комманд и апдейт. Рекордсет тут невыгоден, будет пакет апдейтов, это долго.
   Жан Пердежон
 
26 - 21.08.20 - 16:47
(0) DML-запрос нужен тебе


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