Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа метода Recorset.AddNew на вьюхе / 8 сообщений из 8, страница 1 из 1
20.08.2007, 11:33
    #34737904
Игорь У
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа метода Recorset.AddNew на вьюхе
Имеется в наличие давно написанная и отлаженная программа.
В ней реализованы классы, какждый из которых какбы работает с соотетствующей таблицей БД, через Recordset соответственно.
Долго и нудно реализацию класса описывать не буду, скажу лишь что строка запроса для выбора записей у каждого класса - константа, с именем соотв. таблицы:
Код: plaintext
1.
2.
3.
4.
Const m_sSelect As String = "SELECT * FROM Таблица"
...
'Открытие
rs.Open m_sSelect, con, adOpenDynamic, adLockOptimistic, adCmdText

, а добавление записи происходит с помощью метода AddNew:
Код: plaintext
1.
2.
3.
Public Sub AddRecord()
      rs.AddNew
End Sub
После которого происходит заполнение полей-свойств:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Public Property Let COL_EMPLOE_ID(ByVal vEMPLOE_ID As Variant)
    If IsNull(vEMPLOE_ID) Or IsEmpty(vEMPLOE_ID) Then
        rs("EMPLOE_ID") = Null
    Else
        rs("EMPLOE_ID") = vEMPLOE_ID
    End If
End Property
, ну и "пересылка" записи на сервер при следующем вызове AddNew или Update.
Вобщем всё бы ничего, но таблицы у нас на БД теперь стали одноименными вьюхами, и теперь при добавлении записи вышеуказанным способом возникает ошибка доступа к данным, т.к. доступ на ту таблицу из которой происходит выборка во вьюху - закрыт, а Recordset видимо каким-то образом определяет имя таблицы и "нехочет вставлять запись" во вьюху, обращаясь зачем-то непосредственно к таблице.
ВОПРОС: мождно ли рекордсет "научить" вставлять запись во вьюху, а не делать то, что его не просят (вычленять имя таблицы из запроса вьюхи) ?

PS: Я конечно знаю, что можно делать непосредственно "INSERT Вьюха ...", но тут немного нарушится логика программы, и придется много переделывать.
...
Рейтинг: 0 / 0
20.08.2007, 12:44
    #34738184
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа метода Recorset.AddNew на вьюхе
Ищите в коде строчки где задается rs.Properties("Resync Command")
И rs.Fields(x).Properties("BASETABLENAME") (как еще один ориентир).
...
Рейтинг: 0 / 0
20.08.2007, 12:52
    #34738225
Игорь У
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа метода Recorset.AddNew на вьюхе
Да нету там ничего подобного.
Как я понял, надо задать эти свойства, т.е. прописать имя вьюхи в них?
...
Рейтинг: 0 / 0
20.08.2007, 14:15
    #34738582
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа метода Recorset.AddNew на вьюхе
Если написать SELECT * FROM ИмяВьюхи то рекордсет именно с вьюхой и будет работать.
Если валится сообщение об ошибке "Нет прав обновить таблицу" - то скорее всего ваша вьюха просто сделегировала гранты таблицы.
А те свойства что я назвал в предыдущем посте - как раз для того что бы рекордсет обновлял не через вьюху.
Тут уж сам разберись в чем дело - или вьюха необновляемая, или гранты не проставлены, или ваш рекорсдет где-то вглуби кода перенастраивается на "нестандартный" апдейт.
...
Рейтинг: 0 / 0
20.08.2007, 14:50
    #34738749
Игорь У
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа метода Recorset.AddNew на вьюхе
Да нет, вьюха обновляемая, т.е. INSERT в нее проходит (если из-под SQL запустить);
гранты проставлены так, чтоб нельзя было обратиться к таблице, а к вьюхе можно;
рекорсдет нигде не перенастраивается...
Решил попробовать сделать эмуляцию AddNew через Command, т.е. напрямую INSERT пишу.
...
Рейтинг: 0 / 0
20.08.2007, 14:55
    #34738781
Игорь У
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа метода Recorset.AddNew на вьюхе
Вьюха не сделегировала гранты таблицы, хотя бы потому(помимо того что Insert напрямую проходит), что запроса "Insert Вью ..." вообще нет, идет сразу почему-то "Insert Таблица", смотрел SQL-Profiler'ом (сервер MSSQL-2005)
...
Рейтинг: 0 / 0
20.08.2007, 17:48
    #34739597
Игорь У
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа метода Recorset.AddNew на вьюхе
Сделал заместо AddNew работу через Command, так теперь заметил что rs.MoveNext также вызывает аналогичную ошибку, т.е. теперь SELECT не проходит. Наверно тоже через Command делать придется.
...
Рейтинг: 0 / 0
20.08.2007, 17:55
    #34739635
Игорь У
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа метода Recorset.AddNew на вьюхе
Выкладываю все Properties рекордсета, извиняюсь что много ненужного, но для чистоты эксперимента :)

IChapteredRowset = True
IColumnsInfo = True
IColumnsRowset = True
IConnectionPointContainer = True
IConvertType = True
ILockBytes = False
IRowset = True
IDBAsynchStatus = False
IParentRowset = True
IRowsetChange = True
IRowsetExactScroll = True
IRowsetFind = True
IRowsetIdentity = True
IRowsetInfo = True
IRowsetLocate = True
IRowsetRefresh = True
IRowsetResynch = False
IRowsetScroll = True
IRowsetUpdate = True
IRowsetView = True
IRowsetIndex = False
ISequentialStream = True
IStorage = False
IStream = False
ISupportErrorInfo = True
Preserve on Abort = True
Access Order = 2
Append-Only Rowset = False
Blocking Storage Objects = False
Use Bookmarks = True
Skip Deleted Bookmarks = True
Bookmark Type = 1
Cache Deferred Columns = False
Fetch Backwards = True
Hold Rows = True
Scroll Backwards = True
Change Inserted Rows = True
Column Privileges = False
Command Time Out = 0
Preserve on Commit = True
Defer Column = False
Delay Storage Object Updates = True
Private1 =
Filter Operations = 27
Find Operations = 27
Hidden Columns = 1
Immobile Rows = True
Literal Bookmarks = True
Literal Row Identity = True
Maximum Open Rows = 0
Maximum Pending Rows = 0
Maximum Rows = 0
Column Writable = False
Memory Usage = 0
Notification Granularity = 1
Notification Phases = 31
Column Set Notification = 3
Row Delete Notification = 3
Row First Change Notification = 3
Row Insert Notification = 3
Row Resynchronization Notification = 3
Rowset Release Notification = 3
Rowset Fetch Position Change Notification = 3
Row Undo Change Notification = 3
Row Undo Delete Notification = 3
Row Undo Insert Notification = 3
Row Update Notification = 3
Bookmarks Ordered = True
Others' Inserts Visible = False
Others' Changes Visible = False
Own Inserts Visible = True
Own Changes Visible = True
Quick Restart = True
Reentrant Events = True
Remove Deleted Rows = True
Report Multiple Changes = False
Return Pending Inserts = True
Row Privileges = False
Asynchronous Rowset Processing = 16
Row Threading Model = 1
Server Cursor = False
Strong Row Identity = True
Objects Transacted = False
Unique Rows = True
Updatability = 7
Batch Size = 15
Update Criteria = 2
Background Fetch Size = 15
Initial Fetch Size = 50
Background thread Priority = 3
Cache Child Rows = True
Maintain Change Status = False
Auto Recalc = 1
Unique Table =
Unique Schema =
Unique Catalog =
Resync Command =
Cursor Engine Version = 28
Reshape Name =
Update Resync = 1
Release Shape On Disconnect = False
Bookmarkable = True
IAccessor = True
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Работа метода Recorset.AddNew на вьюхе / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]