|   |   | 
| 
 | Обновление набора записей 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-запрос нужен тебе     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |