Access и ADO

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

Access и ADO

Сообщение hasuhands » 22.11.2004 (Пн) 2:09

Работаю с Access'овской базой с помощью ADO (VB).
Подключаюсь так:
Код: Выделить всё
Public cn As New ADODB.Connection
Public rs As New ADODB.Recordset
Public rsResult As New ADODB.Recordset
Public SQL As String
Public QuerySQL As String
Public Sub main()
    Dim path As String
    path = App.path & "\student.mdb"
    cn.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;data source=" & path & ";"
    cn.Open
    If cn.State = adStateClosed Then
        MsgBox "Connection Error", vbCritical, "Error!"
        End
    Else
        Debug.Print "Connection Object Created"
        cn.CursorLocation = adUseClient
    End If
   
    SQL = "Select * From Ñòóäåíòû"
    rs.Open SQL, cn, adOpenDynamic, adLockOptimistic
    Debug.Print "Recordset Object Created"
   
    Call MainForm.Show
End Sub


Данные отображаю в гриде (GridEx2000). Все бы хорошо, но все вносимые изменения моментально прописываются в рабочую базу данных.

Хочется немного подругому.

1) По нажатию "Создать базу" открывалась новая база. Как вариант - просто открывать заранее подготовленную пустую таблицу.
2) Редактировать ее, но сохранять все изменения в нужный файл ПО ЖЕЛАНИЮ.

Как это можно реализовать?[/quote]

Ronin
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 635
Зарегистрирован: 13.02.2002 (Ср) 14:16
Откуда: Россия, Москва

Сообщение Ronin » 22.11.2004 (Пн) 3:08

Доброго времени суток!

Для того, что-бы можно было сохранять данные в базу изменения только после выполения команды (Update), то тебе нужно изменить свойство LockType рекордсета на adLockBatchOptimistic.
Если тебе надо вообще запретить изменения базы, то на adLockReadOnly.
С уважением,
Игорь Шувалов aka Ronin

hasuhands
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.11.2004 (Ср) 20:14

Сообщение hasuhands » 22.11.2004 (Пн) 16:52

Изменяю базу через грид.
Потом делаю rs.Update - никаких изменений в файл не вносится.
Где копать?

hasuhands
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.11.2004 (Ср) 20:14

Сообщение hasuhands » 22.11.2004 (Пн) 17:03

И еще вопросы:
1) Как можно recordset получившийся записать в другой mdb-файл?
2) Есть рекордсет (главная таблица) с данными студент-стипендия. Я делаю некоторые изменения, но в mdb-файл их НЕ записываю. Теперь нужно сделать запрос (к примеру, select * from Студенты where стипендия<>0) и отобразить в гриде не из mdb-файла, а из имеющегося рекордсета (таблицы с изменениями). Как?

snov
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 176
Зарегистрирован: 28.11.2003 (Пт) 10:12
Откуда: Челябинск

Сообщение snov » 23.11.2004 (Вт) 11:23

Я с этим гридом не знаком, но у него (по идее) должно быть свойство какое-нить типа Updatable. Чтобы изменять его нелбзя было. А меняй уже в др. форме. А! просто закрой базу и обратись к ней заново. все изменения уже будут внесены.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 23.11.2004 (Вт) 11:33

Изменяю базу через грид.
Потом делаю rs.Update - никаких изменений в файл не вносится.


Если Recordset открыт с adLockBatchOptimistic то изменения в базу вносятся по:

Код: Выделить всё
rs.UpdateBatch


1) Как можно recordset получившийся записать в другой mdb-файл?


Напиши свою функцию для этого - в ней создание другой базы и таблицы под твой Recordset, ну и сохрани в нее.

2) Есть рекордсет (главная таблица) с данными студент-стипендия. Я делаю некоторые изменения, но в mdb-файл их НЕ записываю. Теперь нужно сделать запрос (к примеру, select * from Студенты where стипендия<>0) и отобразить в гриде не из mdb-файла, а из имеющегося рекордсета (таблицы с изменениями). Как?


А где тут проблема? Похоже тебе просто надо отфильтровать твой Recordset - ну и отфильтруй его (для этого и запроса к базе не нужно).
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

hasuhands
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.11.2004 (Ср) 20:14

Сообщение hasuhands » 23.11.2004 (Вт) 13:21

А где тут проблема? Похоже тебе просто надо отфильтровать твой Recordset - ну и отфильтруй его (для этого и запроса к базе не нужно).

Ты имеешь в виду такой способ?:
Код: Выделить всё
Public Sub FilterX()

   Dim rstPublishers As ADODB.Recordset
   Dim rstPublishersCountry As ADODB.Recordset
   Dim strCnn As String
   Dim intPublisherCount As Integer
   Dim strCountry As String
   Dim strMessage As String

   ' Open recordset with data from Publishers table.
   strCnn = "Provider=sqloledb;" & _
      "Data Source=srv;Initial Catalog=pubs;User Id=sa;Password=; "
   Set rstPublishers = New ADODB.Recordset
   rstPublishers.CursorType = adOpenStatic
   rstPublishers.Open "publishers", strCnn, , , adCmdTable

   ' Populate the Recordset.
   intPublisherCount = rstPublishers.RecordCount

   ' Get user input.
   strCountry = Trim(InputBox( _
      "Enter a country to filter on:"))

   If strCountry <> "" Then
      ' Open a filtered Recordset object.
      Set rstPublishersCountry = _
         FilterField(rstPublishers, "Country", strCountry)

      If rstPublishersCountry.RecordCount = 0 Then
         MsgBox "No publishers from that country."
      Else
         ' Print number of records for the original
         ' Recordset object and the filtered Recordset
         ' object.
         strMessage = "Orders in original recordset: " & _
            vbCr & intPublisherCount & vbCr & _
            "Orders in filtered recordset (Country = '" & _
            strCountry & "'): " & vbCr & _
            rstPublishersCountry.RecordCount
         MsgBox strMessage
      End If
      rstPublishersCountry.Close

   End If

End Sub

Public Function FilterField(rstTemp As ADODB.Recordset, _
   strField As String, strFilter As String) As ADODB.Recordset

   ' Set a filter on the specified Recordset object and then
   ' open a new Recordset object.
   rstTemp.Filter = strField & " = '" & strFilter & "'"
   Set FilterField = rstTemp

End Function

?

Проблема в том, что запрос осуществляется сразу по нескольким полям с широким применением логических условий. Мне кажется, фильтрация recrofset'а здесь - не очень.

Может быть есть другой способ?
Пока в голове имею только самое лошковое решение:
1) rs сохранить в темповый mdb-файл
2) открыть новый rs, привязать его с темповой базой и с нужным SQL-запросом

Но это уж слишком по-ламерcки. :( Хотя и база совсем не большая.

hasuhands
Новичок
Новичок
 
Сообщения: 26
Зарегистрирован: 17.11.2004 (Ср) 20:14

Сообщение hasuhands » 24.11.2004 (Ср) 13:39

Как считаете?


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

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

Сейчас этот форум просматривают: Yandex-бот и гости: 1

    TopList