Имя: Пароль:
1C
1С v8
Обновление набора записей ADODB, почему не срабатывает?
,
0 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();@
А эт что? Британская королева? (по мотивам анекдота)
4 acht
 
21.08.20
10:28
(0)
rst.CursorType = adOpenKeyset
rst.LockType = adLockOptimistic
5 acht
 
21.08.20
10:29
Ну и CursorLocation = 3;  это adUseClient, что довольно странно
6 acht
 
21.08.20
10:31
И присоединюс к (2) - какую строку ты обновляешь-то?
7 Ёпрст
 
21.08.20
10:35
ну и проще тупо
update tbl1
set Active=0, UsrID='"+ПолучитьУИДПольз()+"'
where msgid = " + msgid_;
8 seraf
 
21.08.20
10:37
я обновить ожидал весь набор записей, апдейтом могу в принципе, но хотел еще через Recordset
не особо синтаксис этот знаю, по примерам смотрю
9 NorthWind
 
21.08.20
10:39
(8) как весь? Вашим кодом вы обновите одну запись в обновляемом рекордсете.
10 seraf
 
21.08.20
10:39
всю отобранную гранулу можно заапдейтить одинаковым значением?
или при переборе отдельные значения

    Пока НЕ rsRES.eof() Цикл
                rsRES.Fields("Active").Value = 0;
                rsRES.Fields("UsrID").Value = Строка(ПолучитьУИДПольз());
                rsRES.Update();
        rsRES.MoveNext();
    КонецЦикла;
11 seraf
 
21.08.20
10:39
а какую моим кодом, одну первую что ли?
12 NorthWind
 
21.08.20
10:40
(11) да
13 NorthWind
 
21.08.20
10:40
(10) да, вот так надо делать
14 NorthWind
 
21.08.20
10:41
только...  вы Edit забыли
15 seraf
 
21.08.20
10:42
Только Update за пределы цикла наверное, да
(14) какой Edit
16 NorthWind
 
21.08.20
10:42
перед тем как изменять поля, сделайте recordset.Edit ()
17 NorthWind
 
21.08.20
10:43
а апдейт, по-моему, из цикла не надо убирать. Он на каждую запись работает. Хотя могу ошибаться, давно не делал, но по-моему, так.
18 NorthWind
 
21.08.20
10:43
другое дело что если вы делаете мувнекст, он, по-моему, все равно неявно апдейтит запись
19 seraf
 
21.08.20
10:45
ну поиграюсь, проверю, спасибо
а что дают 2,3 в rsRES.Open(CommandText, Connection, 2, 3);
без них рекордсет не хотел обновляться, взял из какого-то примера
и CursorLocation = 3;
20 NorthWind
 
21.08.20
10:48
(6) по идее, если он не делает переходов по записям, то апдейтиться будет первая запись (после открытия) в обновляемом рекордсете.
Поскольку у него таблица одна и ключевая инфа явно присутствует (select *), то в общем-то нет никаких препятствий к тому чтобы ADO просралось и правильно поняло чего и как редактировать.
21 acht
 
21.08.20
10:54
22 NorthWind
 
21.08.20
10:57
(19) третий параметр - тип курсора. Курсор - это набор записей на сервере БД. Для скуля чаще всего используется Keyset (1). Вы поставили 2, это динамический, более ресурсоемкий.
Четвертый - тип блокировки. Если вы хотите править по одной записи и полагаете что никто кроме вас в это время трогать записи не будет, то проще всего юзать оптимистический, тогда записи блокируются только когда вызывается Update. Есть еще работа с пакетами записей (батч оптимистик), это отдельная тема, долго рассказывать. Если другие юзеры тоже ковыряют записи, можно пессимистический. Есть еще рид-онли, это значит необновляемый рекордсет будет
23 NorthWind
 
21.08.20
10:57
3 - это и есть оптимистический
24 seraf
 
21.08.20
13:39
спасибо
25 NorthWind
 
21.08.20
16:41
если вы хотите групповое исправление одним значением, лучше адо комманд и апдейт. Рекордсет тут невыгоден, будет пакет апдейтов, это долго.
26 Жан Пердежон
 
21.08.20
16:47
(0) DML-запрос нужен тебе
Программист всегда исправляет последнюю ошибку.