Ado, ASP, Access, RecordSet

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Sil
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 08.11.2004 (Пн) 19:26
Откуда: Moscow

Ado, ASP, Access, RecordSet

Сообщение Sil » 08.11.2004 (Пн) 19:40

Есть страничка asp на vb, которая посредством ado соединяется с базой access. Открыт recordset, из которого удаляются записи методом delete. Можно ли сделать так, чтобы из recordset записи удалялись, а из базы данных - нет?

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 08.11.2004 (Пн) 19:44

Попробуй рекордсет открыть как adReadOnly.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 09.11.2004 (Вт) 9:04

Попробуй присвоить свойству ActiveConnection открытого рекордсета Nothing -- это сделает его "несвязанным". Вот что об этом пишут:
You can change the value of this property after opening the Recordset to send updates to another provider. Or, you can set this property to Nothing (in Microsoft Visual Basic) to disconnect the Recordset from any provider.

Sil
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 08.11.2004 (Пн) 19:26
Откуда: Moscow

Сообщение Sil » 09.11.2004 (Вт) 10:40

Ennor писал(а):Попробуй рекордсет открыть как adReadOnly.

это невозможно, т.к. в этом случае не позволяет вообще использовать метод delete. Говорит, что нет такого метода.
Leon_ писал(а):Попробуй присвоить свойству ActiveConnection открытого рекордсета Nothing -- это сделает его "несвязанным".

Говорит, что не может это сделать при открытом recordset.
________
Можно переформулировать вопрос? Задачка такая:
нужно из recordset считать все записи, но в произвольном порядке. Мне казалось, что проще всего считывать произвольную запись, затем удалять ее (чтобы не было повторений) и следующую считывать. Со считыванием проблем нет, все вроде работает, но содержимое таблички, которое загоняется в recordset, получается одноразовым -)), т.к. при удалении записи из recordset она удаляется из базы. Может быть, есть другой способ добиться того же результата (т.е. случайной выборки)?

Sedge
Alternative Choice
Alternative Choice
Аватара пользователя
 
Сообщения: 1049
Зарегистрирован: 16.05.2002 (Чт) 18:23
Откуда: Somewhere-In-The-Net

Сообщение Sedge » 09.11.2004 (Вт) 10:50

Sil писал(а):Можно переформулировать вопрос? Задачка такая:
нужно из recordset считать все записи, но в произвольном порядке. Мне казалось, что проще всего считывать произвольную запись, затем удалять ее (чтобы не было повторений) и следующую считывать. Со считыванием проблем нет, все вроде работает, но содержимое таблички, которое загоняется в recordset, получается одноразовым -)), т.к. при удалении записи из recordset она удаляется из базы. Может быть, есть другой способ добиться того же результата (т.е. случайной выборки)?

Что мешает использовать для этой цели массив?
Считываешь в него информацию из открытого Recordset'а, а потом используешь по своему усмотрению... Или можно еще организовать то же самое, но через Collection, чтобы не пришлось писать функции для удаления элемента/сжатия массива.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 09.11.2004 (Вт) 11:00

Sil писал(а):
Leon_ писал(а):Попробуй присвоить свойству ActiveConnection открытого рекордсета Nothing -- это сделает его "несвязанным".
Говорит, что не может это сделать при открытом recordset.

Действительно, если открывать рекордсет подобным образом
Код: Выделить всё
rst.Open sQuery, CurrentProject.Connection, adOpenKeyset, adLockOptimistic, adCmdText
, то ActiveConnection в Nothing не выставить. Попробуй сделать это так
Код: Выделить всё
Dim rst As ADODB.Recordset
    Set rst = New ADODB.Recordset
    Set rst.ActiveConnection = CurrentProject.Connection
    rst.CursorLocation = adUseClient
    rst.CursorType = adOpenKeyset
    rst.LockType = adLockOptimistic
    rst.Source = "SELECT * FROM table1"
    rst.Open
    Set rst.ActiveConnection = Nothing

Не знаю, почему надо делать именно так, просто попробуй..
??

Sil
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 08.11.2004 (Пн) 19:26
Откуда: Moscow

Сообщение Sil » 09.11.2004 (Вт) 12:20

2Sedge
Массив использовать, мне кажется, все-таки нерационально, т.к. длина таблицы переменная. Это оставлю как крайний вариант.
С Collection попробую разобраться.
2Leon_
Тоже самое -((. Операция не допускается, если объект открыт.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 09.11.2004 (Вт) 12:33

:roll: Странн-но..
Но это работающий пример, VBA, Access 2002.
Можно еще порекомендовать вместо Collection и массивов использовать опять-таки рекордсет ADO, только конструировать его вручную через Append, и не привязывать его ни к какому Connection сразу. Заполняешь его данными и получается удобная альтернатива массивам и коллекциям -- встроенная сортировка и поиск, и все такое :wink:

Sil
Начинающий
Начинающий
 
Сообщения: 11
Зарегистрирован: 08.11.2004 (Пн) 19:26
Откуда: Moscow

Сообщение Sil » 09.11.2004 (Вт) 13:30

Leon_ писал(а)::roll: Странн-но..
Но это работающий пример, VBA, Access 2002.

версия Access'a совпадают. Только у меня vbscipt. Ну, не может же от этого зависеть? :?
Вечерком посижу с Collection поразбираюсь.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

    TopList